Firebase字段更新异常:修改时新增字段而非覆盖原字段求助
问题修复方案
问题出在Realtime Database更新时传错了键值:你调用updateRealtimeDatabase时传入的是Firestore文档ID,而非药品名称(比如"Plavix 75mg"),导致Realtime Database误以为要新增一个以文档ID为键的字段,而非更新原有药品的数值。
具体修复步骤:
修改
updatePharmaceutical方法中调用updateRealtimeDatabase的逻辑,传入正确的药品名称:
在更新Firestore成功后,先从目标文档中获取药品名称,再传给Realtime Database更新方法:storeCollection.document(documentId).update(updates) .addOnSuccessListener(aVoid -> { Toast.makeText(this, "Successfully updated.", Toast.LENGTH_SHORT).show(); // 获取药品名称后再更新Realtime Database storeCollection.document(documentId).get().addOnSuccessListener(docSnapshot -> { String drugName = docSnapshot.getString("drugName"); updateRealtimeDatabase(drugName, newQuantity); }); }) .addOnFailureListener(e -> Toast.makeText(this, "Error caught while updating document", Toast.LENGTH_SHORT).show());(可选)调整
updateRealtimeDatabase的参数命名,让语义更清晰(不影响功能,仅提升代码可读性):private void updateRealtimeDatabase(String drugKey, String newQuantity) { FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); if (currentUser != null) { String userId = currentUser.getUid(); DatabaseReference userRef = FirebaseDatabase.getInstance().getReference("Pharmacists").child(userId).child("drugData"); userRef.child(drugKey).setValue(newQuantity) .addOnSuccessListener(aVoid -> Log.d("ViewPharmaceuticals", "Realtime Database updated with new quantity")) .addOnFailureListener(e -> Log.e("ViewPharmaceuticals", "Error updating Realtime Database", e)); } }
补充说明:
原代码中updatePharmaceutical调用updateRealtimeDatabase(documentId, newQuantity),这里的documentId是Firestore自动生成的文档ID,和Realtime Database里drugData下的药品名称键完全不匹配,所以才会出现新增字段的问题。修复后,Realtime Database会根据药品名称找到对应字段并更新数值,不会再生成无关的新字段。
内容的提问来源于stack exchange,提问作者Pramuka Navodh
相关产品推荐
相关产品推荐

