Java 侦听Firebase Firestore数据库中的元数据更改

Java 侦听Firebase Firestore数据库中的元数据更改,java,android,firebase,google-cloud-firestore,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) .ad

我正在使用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 ");

                                }
                            }
                        }
                    }
                });
mDb.collection(“Users\u collection”).document(mAuth.getUid()).collection(“Recipients”)
.document(j.getUid()).collection(“消息”).orderBy(“时间”).limit(30)
.addSnapshotListener(MetadataChanges.INCLUDE,new EventListener()){
@凌驾
public void OneEvent(@Nullable QuerySnapshot queryDocumentSnapshots,@Nullable FirebaseFirestoreException e){
如果(e==null){
对于(DocumentChange dc:queryDocumentSnapshots.getDocumentChanges()){
开关(dc.getType()){
案件补充:
Log.d(“chatevents”,“OneEvent:添加”);
messgaesDataClass msg=dc.getDocument().toObject(messgaesDataClass.class);
添加消息(msg);
notifyDataSetChanged();
messagesRecycler.smoothScrollToPosition(messages.size());
打破
已删除的案例:
Log.d(“chatevents”、“OneEvent:已删除”);
案例修改:
Log.d(“chatevents”、“OneEvent:Modified”);
}
}
}
}
});
发送消息时,我想知道如何侦听位于本地缓存中或元数据处于挂起状态且尚未发送到服务器的msg对象?

将消息传递到查询的方法时:

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

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

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

在此情况下,您应该考虑使用SnPoSotoMeta方法:

当我在线时,它会打印:

isFromCache: false
isFromCache: true
当我脱机时,它会打印:

isFromCache: false
isFromCache: true
向查询的方法传递时:

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

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

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

在此情况下,您应该考虑使用SnPoSotoMeta方法:

当我在线时,它会打印:

isFromCache: false
isFromCache: true
当我脱机时,它会打印:

isFromCache: false
isFromCache: true

好的,所以当我发送一条消息并且它还没有发送到服务器时,侦听器文档会被删除。添加的case将在我的switch语句中运行,并带有一个挂起的标记,对吗?因此,当我联机并将其发送到服务器时,它将比document更有效。添加的案例将再次运行或document。修改的案例将运行?否,
OneEvent:Added
将为与您的查询对应的每个项目打印一次,第二次,对于在该特定位置添加的每个新项,以及在该特定时刻对应的
元数据更改。如果您想知道数据何时在Firebase服务器上提交,则需要使用
CompleteListener
。如果网络连接丢失(用户设备上没有网络连接),则不会触发onSuccess()或onComplete()。这种行为是有意义的,因为只有在Firebase服务器上提交(或拒绝)数据时,才会认为任务已完成。现在可以了吗?可以了,所以当我发送一条消息,但它还没有发送到服务器时,侦听器文档就会出现。添加的case将在我的switch语句中运行,并带有一个挂起的标记,对吗?因此,当我联机并将其发送到服务器时,它将比document更有效。添加的案例将再次运行或document。修改的案例将运行?否,
OneEvent:Added
将为与您的查询对应的每个项目打印一次,第二次,对于在该特定位置添加的每个新项,以及在该特定时刻对应的
元数据更改。如果您想知道数据何时在Firebase服务器上提交,则需要使用
CompleteListener
。如果网络连接丢失(用户设备上没有网络连接),则不会触发onSuccess()或onComplete()。这种行为是有意义的,因为只有在Firebase服务器上提交(或拒绝)数据时,才会认为任务已完成。现在可以了吗?