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 中第一次调用时循环。第一次调用后,它只通知 addedmodifiedremoved

以上是关于Firebase : Firestore : 在实时数据库中找到的 ChildEventListener 的等价物是啥的主要内容,如果未能解决你的问题,请参考以下文章

使用Firestore需要firebase-firestore.js文件吗?

无法在firebase.firestore.CollectionReference中使用Array firebase.firestore.Query为什么?

(firebase.firestore 不是函数)尝试在 Firestore 中创建集合时

Firestore 配置 - Firebase

firebase2.default.firestore 不是一个函数 - React Firebase

忽略 firebase.firestore.timestamp