如何在Firestore中使用DocumentReference写入指定postid的子集合文档
Firestore实现对应写入功能的方案
你原来的实时数据库逻辑是在Report/Post节点下以postid为键存储举报数据,对应Firestore的实现代码如下:
import com.google.firebase.firestore.FieldValue; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.firestore.DocumentReference; // 构造对应postid的文档引用,完全对齐原实时数据库的层级结构 DocumentReference reportRef = FirebaseFirestore.getInstance() .collection("Report") .document("Post") .collection("Entries") .document(postModel.getPostid()); HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put("publisher", FirebaseAuth.getInstance().getCurrentUser().getUid()); // Firestore服务端时间戳,等价于原实时数据库的ServerValue.TIMESTAMP hashMap.put("time", FieldValue.serverTimestamp()); hashMap.put("info", edt_comment.getText().toString()); // 写入数据 reportRef.set(hashMap) .addOnSuccessListener(aVoid -> { // 写入成功后的自定义逻辑 }) .addOnFailureListener(e -> { // 写入失败后的自定义逻辑 });
如果不需要严格对齐原实时数据库的层级,也可以简化结构,直接把Post举报作为根集合存储,代码更简洁:
DocumentReference reportRef = FirebaseFirestore.getInstance() .collection("PostReport") .document(postModel.getPostid()); // 后续构造hashMap、set写入的逻辑和上方完全一致
之前写法错误的原因
- 你使用
db.collection("Report").document("Post").set(hashMap)时,是把数据直接写入Report集合下ID为Post的单个固定文档,没有指定要写入的postid作为文档ID,自然无法写入对应postid的条目。 db.document("Report/Post")拿到的仍然是Report集合下Post这个固定文档的引用,Firestore要求集合和文档交替嵌套,你需要在该文档下新增子集合存储多条不同postid的举报数据,或者调整结构直接将postid作为上层集合的文档ID。
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

