【问题标题】:Listen For MetaData Changes in Firebase Firestore database侦听 Firebase Firestore 数据库中的元数据更改
【发布时间】:2019-01-18 11:50:39
【问题描述】:

我正在使用 Firestore 数据库创建一个聊天模块。以下是我监听新消息的监听代码:

   mDb.collection("Users_Collection").document(mAuth.getUid()).collection("Recipients")
                .document(psychichObj.getUid()).collection("Messages").orderBy("time").limit(30)
                .addSnapshotListener(MetadataChanges.INCLUDE, new EventListener<QuerySnapshot>() {
                    @Override
                    public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                        if (e==null){
                            for (DocumentChange dc:queryDocumentSnapshots.getDocumentChanges()){
                                switch (dc.getType()){
                                    case ADDED:
                                        Log.d("chatevents", "onEvent:Added ");
                                        messgaesDataClass msg = dc.getDocument().toObject(messgaesDataClass.class);
                                        messages.add(msg);
                                        chatAdapter.notifyDataSetChanged();
                                        messagesRecycler.smoothScrollToPosition(messages.size());
                                        break;
                                    case REMOVED:
                                        Log.d("chatevents", "onEvent:Removed ");

                                    case MODIFIED:
                                        Log.d("chatevents", "onEvent:Modiefied ");

                                }
                            }
                        }
                    }
                });

当我发送消息时,我想知道如何侦听本地缓存中的 msg 对象或其元数据处于挂起状态且尚未发送到服务器?

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    MetadataChanges 传递给查询的addSnapshotListener(MetadataChanges metadataChanges, EventListener listener) 方法时:

    指示仅元数据更改(即仅 Query.getMetadata() 更改)是否应触发快照事件。

    这基本上意味着每次元数据发生变化时,都会触发监听器。所以在挂起操作的情况下,变量pending的值将会改变。

    我想知道如何监听本地缓存中的 msg 对象

    在这种情况下,您应该考虑使用 SnapshotMetadata 的 isFromCache() 方法:

    Log.d(TAG, "isFromCache: " + documentSnapshot.getMetadata().isFromCache());
    

    当我在线时,它会打印:

    isFromCache: false
    

    当我离线时,它会打印:

    isFromCache: true
    

    【讨论】:

    • 好的,所以当我发送一条消息并且它还没有发送到服务器而不是侦听器文档时。添加的案例将在我的 switch 语句中运行,带有一个挂起的标签,对吧?所以当我在线并将其发送到服务器时,document.Added 案例将再次运行或 document.Modified 案例将运行?
    • 不,onEvent:Added 将为与您的查询对应的每个项目打印一次,第二次,对于在该特定位置添加的每个新项目,MetadataChanges 在该特定时刻对应.如果您想知道数据何时提交到 Firebase 服务器,您需要使用CompleteListener
    • 如果网络连接丢失(用户设备上没有网络连接),则不会触发 onSuccess() 和 onComplete()。这种行为是有道理的,因为只有在 Firebase 服务器上提交(或拒绝)数据时,才认为任务已完成。现在可以了吗?
    猜你喜欢
    • 2021-11-17
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2020-05-14
    • 2011-03-22
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    相关资源
    最近更新 更多