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

Android开发:Kotlin中从Firebase数据库同时获取键与值

解决方案

你的新数据库结构和原有结构差异明显——每个childX节点下不再是固定字段的对象,而是动态键值对,因此需要修改数据读取逻辑,遍历每个childX的子节点来获取键(如nameOfNested1)和对应的值。

修改后的代码实现

在onDataChange中嵌套一层循环,遍历每个商品节点下的嵌套键值对:

dbref = FirebaseDatabase.getInstance().getReference("requiredCategory")
dbref.addValueEventListener(object : ValueEventListener {
    override fun onDataChange(snapshot: DataSnapshot) {
        if (snapshot.exists()) {
            val keyValueList = mutableListOf<Pair<String, String>>()
            for (productSnapshot in snapshot.children) {
                // 遍历当前child节点下的所有嵌套键值对
                for (nestedSnapshot in productSnapshot.children) {
                    val key = nestedSnapshot.key ?: ""
                    val value = nestedSnapshot.value?.toString() ?: ""
                    keyValueList.add(key to value)
                }
            }
            // 将键值对列表传入适配器,替换为你实际的适配器逻辑
            productrecyclerview.adapter = YourKeyValueAdapter(keyValueList)
        }
    }

    override fun onCancelled(error: DatabaseError) {
        // 必须处理数据库读取异常,避免崩溃
        Log.e("FirebaseError", "读取失败: ${error.message}")
    }
})

可选:用数据类封装键值对

如果你希望用数据类统一管理键值对,可定义如下类:

data class KeyValue(
    val key: String? = null,
    val value: String? = null
)

然后修改代码中的列表类型:

val keyValueList = mutableListOf<KeyValue>()
// ...
keyValueList.add(KeyValue(key, value))

注意事项

  • 若嵌套节点的值不是字符串类型(如数字、布尔值),可根据实际类型转换(例如nestedSnapshot.getValue(Int::class.java))
  • 如果需要区分不同childX下的键值对,可额外存储productSnapshot.key(即child1/child2这类节点名)

内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:30:55