首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在FirebaseRecyclerAdapter中发出2个查询

如何在FirebaseRecyclerAdapter中发出2个查询
EN

Stack Overflow用户
提问于 2018-06-01 01:15:17
回答 1查看 440关注 0票数 1

我有两个查询,它们来自不同的源(都是firebase数据库实时),我希望它们出现在我的FirebaseRecyclerAdapter中。我已经对这个特定的问题绞尽脑汁了一段时间,但我什么也想不出来。

我如何实现这一点并将其合并到下面的代码中。

喜欢JSON结构

 "Likes" : {
  "-LAJRnaAaCGrbv8-cXvD" : {
    "5SWi7kiLTdW4WS1MDV5Knxeo0qt1" : {
      "-LDqyWmTa-sbgKpxOztv" : {
        "Likes" : "5SWi7kiLTdW4WS1MDV5Knxeo0qt1"
      }
    },
    "6Zv4wIWV3WOyHxgABXkecK18IJ03" : {
      "-LDlj87M--DZVBgBJTUT" : {
        "Likes" : "6Zv4wIWV3WOyHxgABXkecK18IJ03"
      }
    },
    "ktLMV4x9kGN43Ggrx5YWhkaG7BL2" : {
      "-LDkQ-jAwb7oI3N4T__R" : {
        "Likes" : "ktLMV4x9kGN43Ggrx5YWhkaG7BL2"
      }
    }
  }
},

食谱JSON结构

 "PostRecipe" : {
  "-LAJRnaAaCGrbv8-cXvD" : {
    "appetizer" : "Appetizer",
    "cooking_time" : "40 mins",
    "desert" : "Dessert",
    "difficult_level" : "5",
    "main_course" : "Main course",
    "name" : "Smokey Party Jollof",
    "number_of_people" : "5",
    "photo1" : "https://firebasestorage.googleapis.com/v0/b/chefcook-1865d.appspot.com/o/recipe_photos%2F43262?alt=media&token=07103c5d-9924-4e02-985c-fbc02920228f",
    "photo2" : "https://firebasestorage.googleapis.com/v0/b/chefcook-1865d.appspot.com/o/recipe_photos%2F43237?alt=media&token=1d398256-0058-4f78-a13f-66301acc4f75",
    "photo3" : "something",
    "photo4" : "something",
    "pizza_fritas" : "Pizza, fritas",
    "prepare_time" : "3hrs",
    "side_dish" : "Side dish",
    "tips" : "Blended stew base is the best base for making traditional stew.",
    "userId" : "5SWi7kiLTdW4WS1MDV5Knxeo0qt1",
    "vegetarian" : "Vegetarian"
  }
}

},

MainRecipeFragment.java

...  
mDatabase = FirebaseDatabase.getInstance().
            getReference().child("Post").child("PostRecipe").orderByChild("photo1").startAt(n);

@Override
public void onActivityCreated(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);

mAdapter = new FirebaseRecyclerAdapter<RecipeModel, NewViewHolder>(RecipeModel.class, R.layout
            .activty_content_list,
            NewViewHolder.class, mDatabase) {
        @Override
        protected void populateViewHolder(final NewViewHolder viewHolder, final RecipeModel model,
                                          final int
                position) {
            final DatabaseReference postRef = getRef(position);

            Log.e(TAG , "adpter" + model.getName() + model.getPhoto1());


            // Set click listener for the whole post view
            final String cheeseKey = postRef.getKey();
            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Launch PostDetailActivity
                    Intent intent = new Intent(getActivity(), RecipeDetails.class);
                    intent.putExtra(RecipeDetails.EXTRA_CHEESE_KEY, cheeseKey);

                    startActivity(intent);
                }
            });

            // Bind Post to ViewHolder
            Context context =  getActivity();
            viewHolder.bindToCheese(model, context);

        }
    };

ViewHolder

public class ViewHolder extends RecyclerView.ViewHolder {

String LOG_TAG = ViewHolder.class.getSimpleName();

private View mView;
private ImageView mImageView;
private TextView mTextView;
private static final String TAG = ViewHolder.class.getSimpleName();


public ViewHolder(View view) {
    super(view);
    mView = view;
    mImageView =  view.findViewById(R.id.soup_thumbnail);

    mTextView = view.findViewById(R.id.soup_title);

    //getActivity();


}


public void bindToCheese(Cheeses cheeses, Context c) {


  mTextView.setText(cheeses.getTitle());
    Log.d(TAG, "title"+ cheeses.getTitle());

        Picasso.with(c).load(String.valueOf(cheeses.getImagerUrl())).placeholder(R.mipmap.ic_launcher).fit().into(mImageView);

    Log.e(LOG_TAG, "imageurl"+ cheeses.getImagerUrl() + " title" + cheeses.getTitle()) ;

    //Here, how do i reach Like and extract information inside.
    //I tried the below log, but it is returning null
    Log.e(LOG_TAG, "likes"+ cheeses.getLikes());

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-01 03:03:50

你正在以一种关系的方式思考你的数据库,简单地做就行了,而不是循环2次并得到2个查询,你可以用1个方法就能完成。(这就是为什么firebase结构可以轻松做到这一点)

例如,假设你有菜谱和喜欢,你可以有每个喜欢的内部菜谱,然后循环一次进入那个表,获得喜欢,获得食谱,并在你的回收视图中在一个循环中显示它,不需要考虑查询两个不同的节点。

所以,我建议你在你的数据库中做一个重构,把喜欢放在每个食谱里,然后只循环一次。

例如,您可以使用以下代码

"Likes" : {
  "-LAJRnaAaCGrbv8-cXvD" : {
    "5SWi7kiLTdW4WS1MDV5Knxeo0qt1" : {
      "-LDqyWmTa-sbgKpxOztv" : {
        "Likes" : "5SWi7kiLTdW4WS1MDV5Knxeo0qt1"
      }

这个like对应于这个食谱

 "PostRecipe" : {
  "-LAJRnaAaCGrbv8-cXvD" : {
    "appetizer" : "Appetizer",
    "cooking_time" : "40 mins",
    "desert" : "Dessert",
    "difficult_level" : "5",
    "main_course" : "Main course",...

因此,只需在pushID中添加like,您就可以在PostRecipe中包含您配方和该配方的类似内容,这样您就只需循环一次,并通过一次查询遍历所有配方

这就是你需要做的

 "PostRecipe" : {
      "-LAJRnaAaCGrbv8-cXvD" : {
        "appetizer" : "Appetizer",
         "likes":{
        "5SWi7kiLTdW4WS1MDV5Knxeo0qt1" : {
          "-LDqyWmTa-sbgKpxOztv" : {
            "Likes" : "5SWi7kiLTdW4WS1MDV5Knxeo0qt1"
          }
        "cooking_time" : "40 mins",
        "desert" : "Dessert",
        "difficult_level" : "5",
        "main_course" : "Main course",...

然后,使用这种结构,只需查询表一次,您就可以获得每个食谱的相似信息。

在你的RecipeModel中,你应该有你所需要的所有变量的setter和getter,例如name,appetizers,photo1等等,请确保变量的名称与firebase数据库中的名称相同。

因此,要获取数据,您应该这样做

请记住,您的mRef应该从您的UserID级别开始。这就是mRef.child("PostRecipe").child(uid).addValue....

mRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            try {
                for(DataSnapshot snap :  dataSnapshot.getChildren())
                RecipeModel rm = snap.getValue(RecipeModel.class);
                String name =rm.getName();
                String name =rm.getAppetizer();
                  //and then just create a new variable likes in your POJO
                 String likes = rm.getLikes();

     //and then do whatever you want with the data, remember that forEach will iterate through all the recipes for each user, and then you can get any field inside your users
}
            }catch (Exception ex){
               // Toast.makeText(FacultiesActivity.this, ex.toString(), Toast.LENGTH_LONG).show();

            }
        }

        @Override
        public void onCancelled(DatabaseError error) {
            Toast.makeText(FacultiesActivity.this, "Error", Toast.LENGTH_LONG).
 });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50629565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档