监听Firebase Firestore数据库中的元数据更改

时间:2019-01-18 11:50:40

标签: java android firebase google-cloud-firestore

我正在使用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对象?

1 个答案:

答案 0 :(得分:2)

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

  

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

基本上,这意味着每次元数据更改时,都会触发侦听器。因此,在进行暂挂操作的情况下,变量pending的值将被更改。

  

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

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

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

当我在线时,它会打印:

isFromCache: false

当我离线时,它会打印:

isFromCache: true