как оформить 2 запроса в FirebaseRecyclerAdapter - PullRequest
0 голосов
/ 31 мая 2018

У меня есть 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());

}

1 Ответ

0 голосов
/ 31 мая 2018

Вы думаете, что ваша база данных реляционным способом, просто сделайте это легко, вместо того, чтобы зацикливаться 2 раза и получать 2 запроса, вы можете сделать это всего за 1 подход.(именно поэтому структура firebase позволяет сделать это легко)

Например, допустим, у вас есть рецепты и лайки, вы можете иметь внутри рецепты лайки каждого из них, а затем зацикливаться более 1 раза в этой таблице, получитьлайки, получите рецепт и покажите все это в 1 цикле в своем обзоре переработчиков, не нужно головной боли думать о запросе 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",...

, а затем, с этой структурой, вы можете получить аналог каждого рецепта, просто запросив таблицу 1 раз.

в вашей RecipeModel вы должны иметьУстановщики и получатели для всех переменных, которые вам нужны, например, 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).
 });
...