Java应用集成Firestore点击Join按钮无法写入数据问题求助
问题排查&修复方案
- 首先是异步任务提前结束Activity的问题:你现在两个Firestore写入都是异步操作,两个回调里都写了
finish(),任意一个操作完成就会直接关闭当前Activity,另一个未完成的写入会直接被中断,甚至两个写入都还没执行完页面就销毁,导致数据没写入成功。 - 其次你没有监听写入失败的异常:当前只加了完成监听,没有判断任务是否成功、也没有打印错误日志,权限不足、参数为空、路径错误这类问题都没法定位。
- 检查Firestore安全规则:确认你的安全规则放开了对应集合的写入权限,认证用户可以写入
CurrentUser和EventDetail两个集合,默认规则会拒绝所有写入请求。 - 空值检查:提前判断
fAuth.getCurrentUser()是否为空、event对象是否已经完成初始化、event.getEventDocId()是否有有效值,上述任意值为空都会导致写入路径错误,无法存入数据。
修正后代码参考:
private void addedToJoined(){ // 先做空值校验,避免空指针导致请求失败 if (fAuth.getCurrentUser() == null || event == null || event.getEventDocId() == null) { Toast.makeText(EventDetail.this, "数据加载异常,请重试", Toast.LENGTH_SHORT).show(); return; } final HashMap<String, Object> joinedMap = new HashMap<>(); joinedMap.put("eventName", event.getEventName()); joinedMap.put("eventDate", event.getEventDate()); joinedMap.put("eventVenue", event.getEventVenue()); joinedMap.put("eventDesc", event.getEventDesc()); final HashMap<String, Object> participant = new HashMap<>(); participant.put("eventName", event.getEventName()); participant.put("participated_users_name", fAuth.getCurrentUser().getDisplayName()); // 标记两个任务的完成状态,所有任务完成再关闭页面 final AtomicInteger taskCount = new AtomicInteger(0); fStore.collection("CurrentUser").document(fAuth.getCurrentUser().getUid()) .collection("MyFavourite").add(joinedMap) .addOnSuccessListener(documentReference -> { Toast.makeText(EventDetail.this, "Event saved.", Toast.LENGTH_SHORT).show(); if (taskCount.incrementAndGet() == 2) { finish(); } }) .addOnFailureListener(e -> { // 打印错误日志,方便定位问题 Log.e("FirestoreWrite", "收藏写入失败", e); Toast.makeText(EventDetail.this, "保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); }); fStore.collection("EventDetail").document(event.getEventDocId()).collection("event").add(participant) .addOnSuccessListener(documentReference -> { Toast.makeText(EventDetail.this, "Event added to record.", Toast.LENGTH_SHORT).show(); if (taskCount.incrementAndGet() == 2) { finish(); } }) .addOnFailureListener(e -> { Log.e("FirestoreWrite", "参与者写入失败", e); Toast.makeText(EventDetail.this, "报名失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); }); }
内容的提问来源于stack exchange,提问作者PI PI NAN
相关产品推荐
相关产品推荐

