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
相关产品推荐
相关产品推荐

