Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免调用OneEvent(QuerySnapshot快照,FirestoreException错误),以使用带有firestore的snapshotListener删除邮件?_Java_Android_Firebase_Google Cloud Firestore - Fatal编程技术网

Java 如何避免调用OneEvent(QuerySnapshot快照,FirestoreException错误),以使用带有firestore的snapshotListener删除邮件?

Java 如何避免调用OneEvent(QuerySnapshot快照,FirestoreException错误),以使用带有firestore的snapshotListener删除邮件?,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我正在使用Java中的Firestore,方法如下: firestore.collection("myCollection").addSnapshotListener(listener); 我的听众是: EventListener<QuerySnapshot> listener = new EventListener<QuerySnapshot>() { WriteBatch wb = firestore.batch(); @Over

我正在使用Java中的Firestore,方法如下:

 firestore.collection("myCollection").addSnapshotListener(listener);
我的听众是:

 EventListener<QuerySnapshot> listener = new EventListener<QuerySnapshot>() {
        WriteBatch wb = firestore.batch();
        @Override
        public void onEvent(QuerySnapshot snapshots, FirestoreException error) {
           snapshots.forEach(doc -> {
                // do something with the doc and then delete it
                ...
                wb.delete(doc.getReference()
        }
        wb.commit(); 
}
EventListener=neweventlistener(){
WriteBatch wb=firestore.batch();
@凌驾
public void OneEvent(QuerySnapshot快照,FirestoreException错误){
快照。forEach(文档->{
//对文档执行某些操作,然后将其删除
...
wb.delete(doc.getReference()
}
提交();
}
问题是,当我删除文档时,我再次调用
onEvent
方法。有没有办法避免它

有办法避免吗

当然有。您正在做的是添加一个实时侦听器,每当您在
myCollection
位置进行更改时,该侦听器都会被触发。无论是删除、写入还是更新操作,
onEvent()
方法激发。为了避免这种情况,您应该使用Query的方法只获取一次数据。这是Firebase实时数据库中相应的
addListenerForSingleValueEvent()
方法

编辑:

根据你的评论:

有没有一种方法可以使用侦听器,并仅通过创建(或创建和更新)操作触发OneEvent

是的,确实如此,您可以使用switch语句查看快照之间的更改,正如有关的官方文档所解释的那样

在查询快照之间查看查询结果的实际更改通常很有用,而不是简单地使用整个查询快照。例如,您可能希望在添加、删除和修改单个文档时维护缓存

但是,通过这种方式,使用get()方法,我必须每2分钟安排一次调用(例如),而不是使用侦听器,我会立即获得新数据。唯一的问题是,一旦我读取了新数据,我想删除它,但此操作会再次触发OneEvent()。有一种方法可以使用侦听器,并仅使用create启动OneEvent(或创建和更新)操作?