[英]How is FirebaseDatabase is familiar with Firestore
我對Firebase實時數據庫不太熟悉,但是我從未使用過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();
}
});
}
});
}
甚至不確定這部分是否正確。 我完全不知道第二部分。 有人熟悉這兩種方法可以幫助我嗎?
此代碼使用Firestore API:
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;
}
}
}
});
上面的代碼使用Realtime Database 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文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.