Firebase : Firestore : 在实时数据库中找到的 ChildEventListener 的等价物是啥
Posted
技术标签:
【中文标题】Firebase : Firestore : 在实时数据库中找到的 ChildEventListener 的等价物是啥【英文标题】:Firebase : Firestore : What is the equivalent of ChildEventListener found in Realtime DatabaseFirebase : Firestore : 在实时数据库中找到的 ChildEventListener 的等价物是什么 【发布时间】:2018-03-20 07:41:27 【问题描述】:我有这个用于 Firestore。
FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference ref = db.collection("app/appdata/notifications");
ref.addSnapshotListener((snapshot, e) ->
if (e != null)
Log.w(TAG, "Listen failed.", e);
return;
for (DocumentSnapshot x : snapshot.getDocuments())
System.out.println(x.getData());
);
但我不想使用那个循环,而是只需要获取新的孩子。我想要在 Realtime Db 中看到的类似以下内容。
ref.addChildEventListener(new ChildEventListener()
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey)
Post newPost = dataSnapshot.getValue(Post.class);
System.out.println("Author: " + newPost.author);
System.out.println("Title: " + newPost.title);
System.out.println("Previous Post ID: " + prevChildKey);
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey)
@Override
public void onChildRemoved(DataSnapshot dataSnapshot)
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey)
@Override
public void onCancelled(DatabaseError databaseError)
);
【问题讨论】:
同样在 Firestore 中,您的所有数据都由文档(基本上是键值存储)和集合(文档集合)组成。所以实时数据库和 Firestore 都有一些基本的区别。 【参考方案1】:这就是我实现它的方式。
首先,将 DocumentReference 初始化为:
DocumentReference mDocRef = FirebaseFirestore.getInstance().document("yourData/notifications");
现在使用您的 mDocRef,调用 addSnapshotLisetener()
为 DocumentSnapshot 创建新的 EventListener,如下所示:
mDocRef.addSnapshotListener(new EventListener<DocumentSnapshot>()
@Override
public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e)
//todo your code
);
因此,这将在您第一次设置时抓取您的数据,并且每次更新数据时都会抓取您的数据。
此外,如果您将 Activity 作为上下文传递,它会在您的 Activity 停止时自动分离。
..addSnapshotListener(this, new EventListener<DocumentSnapshot>()...
【讨论】:
根据您的参考,您正在收听“sampleData/yourData”,而不是“sampleData/yourData/notifications”。 现在,这将产生一个错误,引用必须有奇数个路径。 我在这里指出的是,Firestore 中 ChildEventListener 的等效项类似于addSnapshotListener
。是的,段数必须是偶数【参考方案2】:
您需要在 QuerySnapshot 对象上使用 .getDocumentChanges()
以获取自上次快照以来的更改列表。这相当于实时数据库中的子更改事件。例如:
FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference ref = db.collection("app/appdata/notifications");
ref.addSnapshotListener((snapshot, e) ->
if (e != null)
Log.w(TAG, "Listen failed.", e);
return;
for (DocumentChange dc : snapshots.getDocumentChanges())
switch (dc.getType())
case ADDED:
// handle added documents...
break;
case MODIFIED:
// handle modified documents...
break;
case REMOVED:
// handle removed documents...
break;
);
更多详情请见https://firebase.google.com/docs/firestore/query-data/listen#view_changes_between_snapshots。
【讨论】:
至少对我来说,它的工作原理与addChildEventListener()
完全一样。我以为它会遍历文档,但没有循环。它仅在case ADDED
中第一次调用时循环。第一次调用后,它只通知 added、modified 和 removed。以上是关于Firebase : Firestore : 在实时数据库中找到的 ChildEventListener 的等价物是啥的主要内容,如果未能解决你的问题,请参考以下文章
使用Firestore需要firebase-firestore.js文件吗?
无法在firebase.firestore.CollectionReference中使用Array firebase.firestore.Query为什么?
(firebase.firestore 不是函数)尝试在 Firestore 中创建集合时