Android Kotlin Firebase报错:无效文档引用,products段数为1(需偶数)
问题解决
核心报错原因
报错java.lang.IllegalArgumentException: Invalid document reference. Document references must have an even number of segments, but products has 1的本质是:你传入的productId为空字符串或null,导致Firestore的文档路径变成了products/(仅1个路径段),而合法的文档路径必须是集合名/文档ID这种偶数段结构。
具体修复步骤
校验productId参数有效性
在函数开头添加参数校验,避免传入空值触发无效路径:fun updateProductInterestedList(activity: Activity, productId: String, uid: String) { // 先校验productId是否合法 if (productId.isBlank()) { Log.e(activity.javaClass.simpleName, "productId不能为空或空白") if (activity is CheckProductDetailsActivity) { activity.hideProgressDialog() } return } // 后续Firestore操作... }修复代码中的语法错误
你的代码存在几处语法错误,会直接导致运行时异常:- 函数名拼写错误:
upadteProductInterestedList→updateProductInterestedList - Lambda表达式箭头错误:所有
e -需改为e -> - FailureListener代码块结构错误:Log语句要放在FailureListener的lambda内部,否则会脱离回调逻辑执行
- 函数名拼写错误:
修正后的完整代码
fun updateProductInterestedList(activity: Activity, productId: String, uid: String) { // 参数校验 if (productId.isBlank()) { Log.e(activity.javaClass.simpleName, "productId不能为空或空白") if (activity is CheckProductDetailsActivity) { activity.hideProgressDialog() } return } mFirestore.collection(Constants.PRODUCTS) .document(productId) .update(Constants.PRODUCT_INTERESTED, FieldValue.arrayUnion(uid)) .addOnSuccessListener { when(activity) { is CheckProductDetailsActivity -> activity.productInterestedSuccess() } } .addOnFailureListener { e -> when(activity) { is CheckProductDetailsActivity -> activity.hideProgressDialog() } Log.e( activity.javaClass.simpleName, "Error while updating interested list", e ) } }额外检查项
- 确认
Constants.PRODUCT_INTERESTED的取值是"interested",和Firestore文档中的字段名完全一致(Firestore字段名区分大小写) - 检查调用该函数时传入的
uid是否有效,避免传入空值
- 确认
内容的提问来源于stack exchange,提问作者Malhar
相关产品推荐
相关产品推荐

