You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:39:02