Android Studio中无法匹配Firebase文档UID与当前用户UID问题
问题解决:匹配Firestore文档中嵌套的用户UID
核心问题
你的代码中UID匹配逻辑出错:文档里的UID存储在**createdBy嵌套对象**下,但你直接尝试读取根层级的uid字段,导致获取的id为空或无效值,所有文档都被跳过,最终hashMap长度为0。
修复步骤
修正UID读取路径
由于Post类的createdBy是User对象,Firestore中嵌套对象的字段需用点符号访问,应通过document.getString("createdBy.uid")获取正确的UID。处理用户未登录的边界情况
先判断当前用户是否存在,避免currentUser?.uid.toString()在用户未登录时生成"null"字符串,导致匹配逻辑失效。安全调用避免空指针
对读取到的UID和amount做非空判断,防止空指针异常。
修改后的Analyze.kt代码
class Analyze : AppCompatActivity() { private val db = Firebase.firestore private val myCollectionRef = db.collection("posts") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_analyze) supportActionBar?.setDisplayHomeAsUpEnabled(true) // 先检查用户是否登录 val currentUser = FirebaseAuth.getInstance().currentUser if (currentUser == null) { Log.d("TAG", "用户未登录") return } readData(currentUser.uid, object: MyCallback { override fun onCallback(value: HashMap<String,Int>) { Log.d("TAG", value.size.toString()) } }) } private fun readData(userId: String, myCallback : MyCallback) { myCollectionRef.get().addOnCompleteListener { task -> if (task.isSuccessful) { val hashMap : HashMap<String, Int> = HashMap() for (document in task.result) { // 读取嵌套在createdBy下的uid val documentUid = document.getString("createdBy.uid") // 跳过UID为空或不匹配的文档 if (documentUid.isNullOrEmpty() || documentUid != userId) { continue } // 安全解析amount val amount = document.getString("amount")?.toIntOrNull() ?: continue val locate = document.getString("locate").orEmpty() // 更新hashMap hashMap[locate] = hashMap.getOrDefault(locate, 0) + amount } myCallback.onCallback(hashMap) } else { Log.e("TAG", "读取数据失败", task.exception) myCallback.onCallback(HashMap()) } } } interface MyCallback { fun onCallback(value: HashMap<String,Int>) } }
额外优化建议
- 用Firestore查询直接过滤,替代客户端遍历过滤:减少带宽消耗,提升性能。示例:
// 替换get()为whereEqualTo查询 myCollectionRef.whereEqualTo("createdBy.uid", userId) .get() .addOnCompleteListener { task -> // 后续逻辑不变 }
内容的提问来源于stack exchange,提问作者Ajay Satpati
相关产品推荐
相关产品推荐

