You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中无法匹配Firebase文档UID与当前用户UID问题

问题解决:匹配Firestore文档中嵌套的用户UID

核心问题

你的代码中UID匹配逻辑出错:文档里的UID存储在**createdBy嵌套对象**下,但你直接尝试读取根层级的uid字段,导致获取的id为空或无效值,所有文档都被跳过,最终hashMap长度为0。

修复步骤

  1. 修正UID读取路径
    由于Post类的createdBy是User对象,Firestore中嵌套对象的字段需用点符号访问,应通过document.getString("createdBy.uid")获取正确的UID。

  2. 处理用户未登录的边界情况
    先判断当前用户是否存在,避免currentUser?.uid.toString()在用户未登录时生成"null"字符串,导致匹配逻辑失效。

  3. 安全调用避免空指针
    对读取到的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 01:05:23