Как FirebaseDatabase знаком с Firestore - PullRequest
0 голосов
/ 29 июня 2019

Я немного знаком с Firebase Real-Time Database, но я никогда не работал с FireStore. Я немного озадачен тем, как работает пожарный магазин. У меня есть этот код:

mAdapter.setOnItemClickListener(new MealAdapter.OnItemClickListener() {
            @Override
    FirebaseFirestore.getInstance().collection("Users")
                            .document(currentUserUid)
                            .collection("Meal Planner")
                            .document(meals.get(position).getId()).delete().addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            Toast.makeText(MealPlanner.this, "Meal has been removed", Toast.LENGTH_SHORT).show();
                        }
                    });
                }

            });

        }

    @Override
        protected void onStart() {
            super.onStart();

            FirebaseFirestore.getInstance().collection("Users")
                    .document(currentUserUid).collection("Meal Planner").addSnapshotListener(this, new EventListener<QuerySnapshot>() {
                @Override
                public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
                    if(e != null){
                        return;
                    }

                    for(DocumentChange dc : documentSnapshots.getDocumentChanges()){

                        Meal meal = dc.getDocument().toObject(Meal.class);

                        switch(dc.getType()){
                            case ADDED:

                                meals.add(meal);
                                mAdapter.notifyItemRangeInserted(dc.getNewIndex(), meals.size());

                                totalCalories();
                                break;

                            case REMOVED:
                                meals.remove(dc.getOldIndex());
                                mAdapter.notifyItemRemoved(dc.getOldIndex());
                                mAdapter.notifyItemRangeRemoved(dc.getOldIndex(), meals.size());
                                totalCalories();
                                break;

                        }
                    }
                }
            });

        }

Как этот код "переводится" для firebase? Еще не пробовал, но пока, насколько я понимаю, что-то вроде этого:

mAdapter.setOnItemClickListener(new MealAdapter.OnItemClickListener() {
            @Override
            public void onDeleteClick(int position) {

                FirebaseDatabase.getInstance().getReference().child( "Users")
                        .child(currentUserUid)
                        .child("Meal Planner")
                        .child(meals.get(position).getId()).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Toast.makeText(MealPlannerActivity.this, "Meal has been removed", Toast.LENGTH_SHORT).show();
                    }
                });
            }

        });

    }

Даже не уверен, что эта часть права. И я никак не могу понять вторую часть. Кто-нибудь знаком с обоими, чтобы помочь мне?

1 Ответ

1 голос
/ 29 июня 2019

Этот код с использованием API Firestore:

FirebaseFirestore.getInstance().collection("Users")
        .document(currentUserUid).collection("Meal Planner").addSnapshotListener(this, new EventListener<QuerySnapshot>() {
    @Override
    public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
        if(e != null){
            return;
        }

        for(DocumentChange dc : documentSnapshots.getDocumentChanges()){

            Meal meal = dc.getDocument().toObject(Meal.class);

            switch(dc.getType()){
                case ADDED:

                    meals.add(meal);
                    mAdapter.notifyItemRangeInserted(dc.getNewIndex(), meals.size());

                    totalCalories();
                    break;

                case REMOVED:
                    meals.remove(dc.getOldIndex());
                    mAdapter.notifyItemRemoved(dc.getOldIndex());
                    mAdapter.notifyItemRangeRemoved(dc.getOldIndex(), meals.size());
                    totalCalories();
                    break;

            }
        }
    }
});

Выше приведен перевод этого кода с использованием API базы данных реального времени:

FirebaseDatabase.getInstance().getReference().child( "Users")
  .child(currentUserUid)
  .child("Meal Planner")
  .addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
        Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey());

        Meal meal = dataSnapshot.getValue(Meal.class);
        meals.add(meal);

        mAdapter.notifyDataSetChanged();

        // TODO: to be able to notify the adapter more granularly, you'll have to keep track of the index yourself
        //mAdapter.notifyItemRangeInserted(dc.getNewIndex(), meals.size());

        totalCalories();    
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
        Log.d(TAG, "onChildChanged:" + dataSnapshot.getKey());

        // A meal has changed, use the key to determine if we are displaying this
        // meal and if so displayed the changed meal.

        // ...
    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {
        Log.d(TAG, "onChildRemoved:" + dataSnapshot.getKey());

        // A mean has been removed, use the key to determine if we are displaying this
        // comment and if so remove it.
        String mealKey = dataSnapshot.getKey();

        // ...
    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
        Log.d(TAG, "onChildMoved:" + dataSnapshot.getKey());

        // A meal has changed position, use the key to determine if we are
        // displaying this meal and if so move it.

        // ...
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "meals:onCancelled", databaseError.toException());
        Toast.makeText(mContext, "Failed to load meals.",
                Toast.LENGTH_SHORT).show();
    }
};

Также см. Документацию Firebase по прослушиваниюдля детских событий .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...