如何在未知ID的情况下从Firebase读取数据?
如何在未知ID的情况下读取Firebase中operations列表的数据?
我有一个operations列表,每个子节点都包含自动生成的ID,现在想在不知道这些ID的前提下读取列表中的数据,数据库结构如下:
我写了一段代码但无法正常运行:
myRef.child("Анна Валерьевна").child("operations").addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { String s = ""; for (DataSnapshot ds : snapshot.getChildren()){ if (snapshot.child("name").getValue(String.class) != null) { s = snapshot.child("name").getValue(String.class); } adapter.add(s); } } @Override public void onCancelled(@NonNull DatabaseError error) { } });
问题分析
你的代码核心错误是循环里误用了外层的snapshot而非循环变量ds:
snapshot指向的是operations节点本身,这个节点下并没有name字段;- 循环中的
ds才是operations下每个带自动ID的子节点,你需要从ds中读取name字段。
修正后的代码
myRef.child("Анна Валерьевна").child("operations").addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { for (DataSnapshot ds : snapshot.getChildren()){ // 从当前循环的子节点ds中读取name字段 String name = ds.child("name").getValue(String.class); if (name != null) { adapter.add(name); } } } @Override public void onCancelled(@NonNull DatabaseError error) { // 建议添加错误日志,方便排查问题 Log.e("FirebaseError", "读取数据失败", error.toException()); } });
额外建议
- 如果
operations下的子节点有固定数据结构,可以创建对应的实体类(比如Operation),用ds.getValue(Operation.class)直接反序列化,代码会更简洁易维护; - 不要忽略
onCancelled方法,添加错误处理能帮你快速定位权限不足、网络异常等问题。
内容的提问来源于stack exchange,提问作者Nuriya
相关产品推荐
相关产品推荐

