Firestore文档更新异常:支付后重复创建OtherDetails文档问题
Android Firestore更新支付状态时重复创建OtherDetails文档的解决方案
问题现象
在Android应用中完成下单操作后,更新支付状态时出现Firestore文档异常:无法定位到OtherDetails集合中已创建的目标文档,反而每次更新都会生成新的文档,最终导致该集合出现大量重复条目。
问题根源
- 下单方法
placeOrderDetails中创建OtherDetails文档时,使用无参的.document()方法,Firestore会自动生成随机文档ID,没有固定的唯一标识; - 更新方法
updateOrderStatus中同样调用无参.document()生成新的随机ID,导致每次更新请求都指向全新的文档路径,无法匹配下单时创建的原始文档,最终触发set()逻辑创建重复文档。
解决方案
给OtherDetails集合下的文档指定固定的、可复用的文档ID,确保创建和更新操作指向同一个文档。推荐使用语义化的固定ID(如"order_summary")或直接复用orderID,以下是具体修改步骤:
1. 修改下单方法placeOrderDetails的文档创建逻辑
将原随机生成文档ID的代码,改为指定固定ID:
// 替换原OtherDetails文档创建代码 firestore.collection("ORDERS").document(orderID) .collection("OtherDetails") .document("order_summary") // 指定固定文档ID .set(orderDetails) .addOnSuccessListener { result.value = Resource.Success(true) }.addOnFailureListener { result.value = Resource.Error(it.message.toString()) }
2. 修改更新方法updateOrderStatus的文档引用逻辑
同样使用与创建时一致的固定文档ID,确保精准定位到目标文档:
// 替换原test文档引用代码 val test = firestore.collection("ORDERS").document(orderID) .collection("OtherDetails") .document("order_summary") // 与创建时使用相同的固定ID
可选优化:改用Firestore协程API简化异步逻辑
原代码使用回调嵌套,可读性和可靠性较差,建议改用Firestore官方协程API(需依赖com.google.firebase:firebase-firestore-ktx),简化异步操作:
// 修改placeOrderDetails中的异步逻辑 try { firestore.collection("ORDERS").document(orderID) .collection("OtherDetails") .document("order_summary") .set(orderDetails) .await() result.emit(Resource.Success(true)) } catch (ex: Exception) { result.emit(Resource.Error(ex.message.toString())) } // 修改updateOrderStatus中的异步逻辑 try { val docRef = firestore.collection("ORDERS").document(orderID) .collection("OtherDetails") .document("order_summary") val document = docRef.get().await() if (document.exists()) { docRef.update(updateStatusHashMap).await() } else { docRef.set(updateStatusHashMap).await() } // 同步更新USER_ORDERS firestore.collection("USERS").document(firebaseAuth.currentUser?.uid!!) .collection("USER_ORDERS").document(orderID) .set(userOrder) .await() result.emit(Resource.Success(true)) } catch (ex: Exception) { result.emit(Resource.Error(ex.message.toString())) }
验证步骤
- 完成下单操作后,检查Firestore控制台的
ORDERS/{orderID}/OtherDetails路径,确认仅存在一个ID为order_summary的文档; - 触发支付回调,执行状态更新操作,确认该文档的
PAYMENT STATUS和ORDER STATUS字段正确更新,无新文档生成。
内容的提问来源于stack exchange,提问作者Dr Mido
相关产品推荐
相关产品推荐

