如何在 FirebaseRecyclerAdapter 中发出 2 个查询

how to issue 2 queries in FirebaseRecyclerAdapter

我有 2 个查询来自不同的来源(都是实时的 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());

}

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

例如,假设您有食谱和点赞,您可以在每个食谱中添加喜欢的食谱,然后循环 1 次进入 table,获取点赞,获取食谱并显示它all in 1 loop in your recyclerview, 无需为查询 2 个不同的节点而头疼。

所以,我建议你在你的数据库中进行重组,将喜欢的东西放在每个食谱中,然后循环 1 次。

比如你有这个

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

这个赞对应这个菜谱

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

所以,只需像在 pushID 中添加那样,您就可以在 PostRecipe 中包含您的食谱和该食谱的类似内容,这样您只需循环一次,并通过 1 个查询遍历所有食谱

这就是你需要做的

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

然后,使用此结构,您只需查询 table 1 次即可获得每个食谱的点赞数。

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

所以,要获取数据,您应该这样做

请记住,您的 mRef 应该从您的用户 ID 级别开始。即 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).
 });