Firestore数据更新异常:同方法在不同类中更新失败问题排查
问题排查与解决方案
这问题我太熟悉了!核心坑点在于Firebase Firestore的异步操作执行顺序,咱们一步步拆解:
问题根源:异步回调的执行时机
你的代码里,userDocRef.get()是异步操作——它会在后台线程去拉取数据,而主线程会继续往下执行后面的更新代码。也就是说:
- 后面的更新逻辑会先于
onSuccess回调执行 - 此时
warmups_skipped还是初始值,根本没被currentUser.getWarmupsSkipped()+1修改 - 日志显示“文档已保存”只是说明更新请求发送成功,但实际存的是旧值,所以云端看起来没变化
而你另一个类直接覆盖数据能成功,是因为那里不需要依赖异步获取的旧值,不存在顺序问题。
修复方案:把更新逻辑放到异步回调内部
确保只有在成功获取到最新用户数据、修改完本地变量后,再执行更新操作。修改后的代码如下:
FirebaseFirestore db = FirebaseFirestore.getInstance(); FirebaseUser currUser = FirebaseAuth.getInstance().getCurrentUser(); DocumentReference userDocRef = db.collection("Users").document(currUser.getEmail()); // 获取当前用户数据并更新本地变量,同时执行后续更新 userDocRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() { @Override public void onSuccess(DocumentSnapshot documentSnapshot) { User currentUser = documentSnapshot.toObject(User.class); int updatedWarmupsSkipped = currentUser.getWarmupsSkipped() + 1; Log.d(TAG, "DocumentSnapshot successfully retrieved! " + updatedWarmupsSkipped); // 把更新逻辑移到这里,确保用的是最新计算后的值 Map<String, Object> update = new HashMap<>(); update.put(WARMUPSSKIPPED, updatedWarmupsSkipped); userDocRef.set(update, SetOptions.merge()) .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Log.d(TAG, "Document has been saved with updated value!"); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.e(TAG, "Document could not be saved", e); // 这里建议用Log.e,同时打印异常信息 } }); } });
额外检查项
- 字段名一致性:确认
WARMUPSSKIPPED常量的字符串值,和Firestore云端Users集合中文档的字段名完全一致(Firestore对大小写、拼写敏感) - 异常日志优化:把更新失败的日志从
Log.d改成Log.e,并打印e的详细信息,万一有权限或字段类型不匹配的问题,能快速定位
内容的提问来源于stack exchange,提问作者Vr33ni
相关产品推荐
相关产品推荐

