【问题标题】:DocumentSnapshot is always null for a valid document reference对于有效的文档引用,DocumentSnapshot 始终为 null
【发布时间】:2019-05-05 12:46:03
【问题描述】:

我在 Firestore 上存储结构化数据,我想获取特定嵌套文档的数据,并且它必须是实时的,因为数据是实时更新的。

这是 Firestore 中的结构:

所以基本上,我有以下路径:

collection(Users).document(23).collection(orders).document(16)
or
/Users/23/orders/21

..我想获取“订单”集合的文档 16 的数据。


这是代码

  class FireStoreMapActivity{
  DocumentReference  doc;


    void getData(){

    doc = FirebaseFirestore.getInstance()
                    .collection("Users")
                    .document(23 + "")
                    .collection("orders")
                    .document(21 + "");

     doc.addSnapshotListener(this, (documentSnapshot, e) -> {

                if (documentSnapshot != null) {
                    if (documentSnapshot.exists()) {
                        List<String> images = (List<String>) documentSnapshot.get("images");
                        Log.e(">>>>>>>>>>> size => ", locHistory.size() + " ");

                    } else {
                        Log.e(">>>>>>>> error ", " documentSnapshot != exists");
                    }
                } else {
                    Log.e(">>>>>>>> error ", " documentSnapshot = null");
                }
            });
  }
}

但是每次都会出现空日志 Log.e(">>>>>>>> error ", " documentSnapshot = null");

更新

好吧,打印异常后似乎是权限错误!

com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Missing or insufficient permissions.

这是我的规则集

service cloud.firestore {
  match /databases/{database}/documents {
    match /Users/{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

但是如何通知 Firestore 我实际上是经过身份验证的用户。!?

【问题讨论】:

  • 如果documentSnapshotnull 并且您确定文档存在,那么e 将有一个值。打印出来看看问题出在哪里(通常是权限问题)。
  • @FrankvanPuffelen 你说得对,这是权限问题!请看更新!
  • 当您尝试从 Firestore 读取数据时,您似乎没有登录,或者至少没有登录。鉴于您共享的代码没有显示任何有关身份验证的信息,因此很难说更多。但是,如果您想验证,请在致电 addSnapshotListener 之前使用 Log.i("User", FirebaseAuth.getInstance().getCurrentUser()) 之类的内容记录当前用户
  • 伙计,你又是对的,我照你说的做了,它显示为null,所以我确保在获取任何数据之前我已经登录,它就像魅力一样。非常感谢,请发布您在答案中提到的提示,以便我将其标记为已接受,其他人将来会考虑它。

标签: android firebase firebase-authentication google-cloud-firestore firebase-security


【解决方案1】:

如果documentSnapshotnull 并且您确定文档存在,那么e 将有一个值。打印它以查看问题所在,这通常与权限有关。


根据您的更新,您的规则似乎只需要经过身份验证的用户,但您的侦听器被服务器基于这些规则拒绝。这意味着您没有登录,或者至少在您尝试从 Firestore 读取时没有登录。

鉴于您分享的代码没有显示任何关于身份验证的内容,因此很难说更多。但是,如果您想验证,请在您致电 addSnapshotListener 之前使用 Log.i("User", FirebaseAuth.getInstance().getCurrentUser()) 之类的内容登录当前用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多