在firestore

时间:2018-04-12 14:05:16

标签: android firebase android-recyclerview listener google-cloud-firestore

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

我在尝试区分Snapshot事件侦听器的响应是第一次响应(在这种情况下是否会返回集合中的所有文档)或更改事件响应时遇到了麻烦,我想这样做添加检查以确定发生了哪些更改。 这个  同一文件中的脚注如下:

要点:第一个查询快照包含与查询匹配的所有现有文档的已添加事件。这是因为您获得了一组更改,使您的查询快照与查询的初始状态保持同步

未提及如何使用后续查询快照识别第一个查询快照。

我只能在SO上找到相关问题one,但在我的案例中没有用。

任何帮助都非常受欢迎,因为我已经没有方向去了。

感谢。

2 个答案:

答案 0 :(得分:3)

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

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类型更改仅针对您之前为此收听者看到的文档发布。

答案 1 :(得分:-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!!');
};
});