Java 如何检查Firestore文档创建是否失败';不行?

Java 如何检查Firestore文档创建是否失败';不行?,java,android,google-cloud-firestore,Java,Android,Google Cloud Firestore,我有一个在Firestore中创建文档的java方法: private void createNewDocument(CollectionReference usersRef, String deviceId, SharedPreferences prefs) { Map<String, Object> user = new HashMap<>(); user.put("timeStamp", FieldValue.serverTime

我有一个在Firestore中创建文档的java方法:

private void createNewDocument(CollectionReference usersRef, String deviceId, SharedPreferences prefs) {
    Map<String, Object> user = new HashMap<>();
    user.put("timeStamp", FieldValue.serverTimestamp());

    usersRef.document(deviceId).set(user)
            .addOnSuccessListener(aVoid -> {
                Log.i(TAG, "Document successfully created");
            })

            //I need all cases other than success. The bottom two don't work all the time
            .addOnCompleteListener(task -> {
                if (!task.isSuccessful()) {
                    Log.v(TAG, "Not successful");
                    creationFailed(prefs);
                }
            })
            .addOnFailureListener(e -> {
                Log.w(TAG, "Error adding document", e);
                creationFailed(prefs);
            });

}
private void createNewDocument(CollectionReference usersRef、String deviceId、SharedReferences prefs){
Map user=newhashmap();
user.put(“timeStamp”,FieldValue.serverTimestamp());
usersRef.document(deviceId).set(用户)
.addOnSuccessListener(避免->{
Log.i(标记“文档成功创建”);
})
//除了成功,我需要所有的案例。最底层的两个不总是有效的
.addOnCompleteListener(任务->{
如果(!task.issusccessful()){
Log.v(标记“未成功”);
creationFailed(prefs);
}
})
.addOnFailureListener(e->{
Log.w(标签“添加文档时出错”,e);
creationFailed(prefs);
});
}

因此,我关闭了互联网,以测试在没有互联网访问的情况下调用
createNewDocument()
时应用程序会做什么,令我沮丧的是,既没有调用
addOnCompleteListener()
也没有调用
addOnFailureListener()
。我需要知道除了成功创建文档之外什么时候会发生。我如何做到这一点?

原因是
Firestore
数据库默认情况下在本机应用程序上启用了持久性。你可以阅读更多关于它的内容。只有当数据保存到服务器时才会调用
addOnSuccessListener

这意味着您甚至不需要检查是否保存了数据。正如您所看到的,代码甚至不是异步的。Firebase SDK将在获得连接后立即将数据同步到Firestore数据库

您可以使用以下选项禁用
持久性

FirebaseFirestoreSettings设置=新建FirebaseFirestoreSettings.Builder()
.setPersistenceEnabled(真)
.build();
db.setFirestoreSettings(设置);
我不建议这样做

或者使用
onSnapshotListener
并将其配置为侦听所解释的本地更改:

最终文件参考docRef=db.集合(“城市”)文件(“SF”);
docRef.addSnapshotListener(新的EventListener(){
@凌驾
public void onEvent(@Nullable DocumentSnapshot快照,
@可为空的FireBaseFireStore异常(e){
如果(e!=null){
Log.w(标记“侦听失败”,e);
返回;
}
String source=snapshot!=null&&snapshot.getMetadata().hasPendingWrites()
?“本地”:“服务器”;
if(snapshot!=null&&snapshot.exists()){
Log.d(标记,源+“数据:”+snapshot.getData());
}否则{
Log.d(标记,源+“数据:空”);
}
}
});

在大多数情况下,当设备重新连接时,依靠Firebase SDK保存数据就足够了。这就是我的建议。继续使用代码,就像它已保存一样。如果bussinies逻辑可以做到这一点。

那么,如果没有internet,文档和数据库将在用户设备上创建,就好像它是共享引用一样?也就是说,如果用户一直处于脱机状态,我的应用程序是否可以始终从他的设备读取文档?同样要明确的是,原始问题的答案是:
if(snapshot!=null&&snapshot.exists()){Log.d(TAG,source+“data:+snapshot.getData());}
在文档创建因任何原因失败时始终有效?是,将在用户设备上创建文档。即使用户处于离线状态,他也可以读取他以前听过的数据。他当然不能在离线状态下从数据库中获取新数据,但他已经拥有的数据是可唤醒的。请回答第二条评论。对即使用户处于脱机状态,更改数据后也会立即调用侦听器。