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