Firestore 中首次查询快照和更改侦听器之间的区别

问题描述 投票:0回答:3

我正在关注 firestore here 的文档,并尝试在集合上附加快照侦听器以获取实时更新。

我在尝试区分来自快照事件侦听器的响应是首次响应(在这种情况下将返回集合中的所有文档)还是更改事件响应(在这种情况下我想添加检查以确定发生了什么变化。 这 同一文档中的脚注如下:

重要提示:第一个查询快照包含与查询匹配的所有现有文档的添加事件。这是因为您正在获得一组更改,这些更改使您的查询快照与查询的初始状态保持一致

没有提及如何将第一个查询快照与后续查询快照进行识别。

我能找到的唯一相关问题是这个one,但这对我的情况没有帮助。

非常感谢任何帮助,因为我已经找不到方向了。

谢谢。

android firebase android-recyclerview listener google-cloud-firestore
3个回答
3
投票

仔细查看您引用的文档中的代码。它正在检查 QuerySnapshot 对象中每个 DocumentChange 对象的 Type

for (DocumentChange dc : snapshots.getDocumentChanges()) {
    switch (dc.getType()) {
        case ADDED:
            Log.d(TAG, "New city: " + dc.getDocument().getData());
            break;
        case MODIFIED:
            Log.d(TAG, "Modified city: " + dc.getDocument().getData());
            break;
        case REMOVED:
            Log.d(TAG, "Removed city: " + dc.getDocument().getData());
            break;
    }
}

这与您引用的文字一致:

第一个查询快照包含与查询匹配的所有现有文档的added事件。

您可以判断您是否是第一次看到某个文档,因为它是“添加”类型的更改。 MODIFIED 和 REMOVED 类型更改仅针对您之前见过的此侦听器的文档发出。


0
投票

我正在做这样的事情来跟踪当地的状态

let localCollection = {};

        if(change.type == 'added')
        {
            localCollection[change.doc.ref.id] = change.doc;
        }
        if(change.type == 'modified') {
        let changeObject = {};
        console.log("Before", localCollection[change.doc.ref.id].data());
        changeObject.before = localCollection[change.doc.ref.id];
        changeObject.after = change.doc;
        console.log("After", change.doc.data());

-1
投票

// flag
let flag = false;

collectionRef.onSnapshot((snapshot) => {
snapshot.docChanges().forEach((change) => {

    // NOTE: ctrl first execute
    if (!flag) {
        console.log('not initilized');
        return;
    }

    // anything
    console.log('only after initilized');
}, (err) => {
    console.log(err);
});

// set flag true 
if (!flag) {
    flag = true
    console.log('listener initilized!!');
};
});

© www.soinside.com 2019 - 2024. All rights reserved.