【问题标题】:Firestore operations (add(), set()) not workingFirestore 操作(add()、set())不起作用
【发布时间】:2017-11-12 13:23:16
【问题描述】:

我正在尝试将用户详细信息添加到 Firestore db,但无法在其中写入数据。

实际上,onSuccess()onFailure() 都没有触发任何侦听器。

这是我的代码。

Map<String,Object> userlol = new HashMap<>();
userlol.put("name",name);
userlol.put("email",email);
userlol.put("uid",currentUser.getUid());
Log.d(TAG, "we are here");
CollectionReference dc = db.collection("users");
DocumentReference dd = dc.document(currentUser.getUid());
dd.set(userlol)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Toast.makeText(SignupActivity.this, "User Added" ,
                        Toast.LENGTH_SHORT).show();
                Log.d(TAG,"User added to database");
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(SignupActivity.this, "ERROR" +e.toString(),
                        Toast.LENGTH_SHORT).show();
                Log.d(TAG, e.toString());
            }
        });

我的logcat中没有toast也没有Log。我可以看到

D/日志记录:我们在这里

这个日志和这个方法之后的日志。

规则没有问题,因为 onFailure() 也不起作用。

我已经搜索了所有可能的东西,但没有任何效果。

【问题讨论】:

  • 我的 wifi 已关闭。哈哈

标签: android google-cloud-firestore


【解决方案1】:

我无法触发任何回调的唯一方法是当我的设备上没有网络连接时。在这种情况下,这种行为是有意义的,因为只有在服务器上提交(或拒绝)数据时才认为任务已完成。

要轻松查看 Firestore 客户端是否确实无法连接到服务器,请启用调试日志记录:

FirebaseFirestore.setLoggingEnabled(true);

这样做后我看到这样的日志条目:

11-12 07:56:21.366 10034-10066/com.firebase.firestorestackoverflow I/Firestore: (0.6.6-dev) [zzetk]: (b6322ac) 流已关闭,状态为:zzcd{code=UNAVAILABLE,说明=null,cause=java.net.UnknownHostException:无法解析主机“firestore.googleapis.com”:没有与主机名关联的地址 在 java.net.InetAddress.lookupHostByName(InetAddress.java:470) 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 在 java.net.InetAddress.getAllByName(InetAddress.java:215) 在 io.grpc.internal.zzbj$zzb.zztu(未知来源) 在 io.grpc.internal.zzbk.run(未知来源) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 在 java.lang.Thread.run(Thread.java:818) 引起:android.system.GaiException:android_getaddrinfo失败:EAI_NODATA(没有与主机名关联的地址) 在 libcore.io.Posix.android_getaddrinfo(本机方法) 在 libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55) 在 java.net.InetAddress.lookupHostByName(InetAddress.java:451) 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 在 java.net.InetAddress.getAllByName(InetAddress.java:215) 在 io.grpc.internal.zzbj$zzb.zztu(未知来源) 在 io.grpc.internal.zzbk.run(未知来源) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 在 java.lang.Thread.run(Thread.java:818) }。

【讨论】:

  • 我不认为这是一个连接问题,因为我正在同时对用户进行身份验证,而且即使在启用调试日志记录后,我也看不到像你这样的日志。
  • @SahdeepSingh 你有没有弄清楚 - 有同样的问题 - 我的应用程序像以前一样工作 - 在升级一些库之后,没有 wrtie 到 firestore 是可行的:/
【解决方案2】:

对于将来遇到该问题的任何人来说,只需卸载您的应用程序并重新安装它,就像它接缝一样野蛮,它可以工作(y)

【讨论】:

  • 有同样的问题。卸载没有帮助。
  • 这个解决方案解决了我的问题。谢谢!
【解决方案3】:

我遇到了同样的问题。 首先,正如@Frank van Puffelen 建议的那样,打开日志有很大帮助。 就我而言,我得到“Cloud Firestore API 不适用于 Datastore 模式项目”。 所以我去了 GCP 并通过将数据库更改为本地数据库手动创建了一个集合。然后我在 gui 上有一个选项。 现在错误更改为“FirebaseFirestoreException:permission_denied:缺少或不足的权限” 所以我更改了firestore中“规则”选项卡下的权限。 这为我解决了问题:)

我猜问题是从一开始的权限,但我现在不能确定。

【讨论】:

    【解决方案4】:

    我有同样的错误。就我而言,我正在创建一个用户并自动将他/她注销,以便他们手动登录。 我删除了注销,因为如果没有用户登录,数据似乎不会被写入。 写入数据时是否有用户登录?创建用户自动登录。 希望对您有所帮助!

    【讨论】:

      【解决方案5】:

      看起来就像在清单文件中添加新权限后一样,必须重新安装应用程序才能注册更改。添加firestore连接后,我尝试重新安装该应用程序,一切正常。瞧!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-04
        • 2012-05-03
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        • 2012-08-21
        • 1970-01-01
        • 2016-01-02
        相关资源
        最近更新 更多