Firebase 实时数据库:如何迭代每个键值
Posted
技术标签:
【中文标题】Firebase 实时数据库:如何迭代每个键值【英文标题】:Firebase RealTime Database: How iterate each key value 【发布时间】:2021-06-28 12:50:00 【问题描述】:我的 Firebase RealTime JSON 数据库结构如下所示
首先,我想从公司简介中迭代不同的公司名称,例如 [演示公司、演示公司二、演示公司三] 在我得到这个之后,我现在想获取这个列表的子项目,这次公司名称是子引用对象,第二个列表看起来像 [Circuit 1, Circuit 2, ...]。现在我想再深入一点,这次电路名称是子引用对象,现在我想要包名称列表示例(0603,...),就像这样。
简而言之,首先我想要父名称,然后是子父名称等等,最后我想要键值对和所有父名称。
我试过的代码示例看起来像
TextView tvTestDelete = findViewById(R.id.tv_test_delete);
mFirebaseDatabase = FirebaseDatabase.getInstance();
mDatabaseReference = mFirebaseDatabase.getReference().child("Company Profile");
mChildEventListener = new ChildEventListener()
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName)
Map<String, Object> testDeleteItem = (Map<String, Object>) snapshot.getValue();
String temp = "";
for(DataSnapshot i : snapshot.getChildren())
temp += i.getKey() + ", ";
tvTestDelete.setText(temp);
@Override
public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName)
@Override
public void onChildRemoved(@NonNull DataSnapshot snapshot)
@Override
public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName)
@Override
public void onCancelled(@NonNull DatabaseError error)
;
mDatabaseReference.addChildEventListener(mChildEventListener);
我是 android 和 firebase 连接及其工作原理的初学者。我真的很抱歉我的英文解释不好,如果你不明白我的问题,请问我哪一部分,我会尽力解释。请帮帮我。
我真的会提前谢谢你。
【问题讨论】:
代码的哪一部分没有按照您期望的方式运行?所以:当您在调试器中单步执行onChildAdded
时,它会做什么?你期望它做什么?我也推荐阅读:***.com/questions/66832359/…
for(DataSnapshot i : snapshot.getChildren()) temp += i.getKey() + ", "; 在此代码行中,我希望所有子名称都像 [Demo Company, Demo Company 2, Demo Company 3],会出现但我只得到一个名字 [Demo Company 2]。
【参考方案1】:
由于您使用的是addChildEventListener
,因此您的onChildAdded
将被/Company Profile
的子节点调用。因此,您的onChildAdded
会被调用一次,每个孩子都有该孩子的快照:Demo Company
、Demo Company Three
、Demo Company Two
。
在onChildAdded
内部,然后您循环遍历每个子节点,因此此时您需要在 JSON 中再下一层,最后在 Demo Company/Demo Circuit 1
、Demo Company/Demo Circuit 2
等节点上调用 i.getKey()
, 之后还有Demo Company Three/Demo Circuit 1
等。
如果您只想记录直接子节点的键,那么在您当前的代码中可以使用 snapshot.getKey()
。
您也可以addValueEventListener
,在这种情况下,您的onDataChange
会使用所有/Company Profile
的快照调用,在这种情况下,您将像现在一样循环访问getChildren()
以获取孩子您正在寻找的节点。
【讨论】:
谢谢先生,addValueEventListener 对我有用。以上是关于Firebase 实时数据库:如何迭代每个键值的主要内容,如果未能解决你的问题,请参考以下文章
我应该如何在 Firebase 实时数据库中设置作为键值类型的 getter 和 setter?
在 Firebase 实时数据库中,我如何遍历每个产品并在回收站视图中显示它们的详细信息
如何使用 Firebase 实时数据库创建特定用户所有已保存帖子的列表?
如何从 Flutter 中的 Firebase 实时数据库中按 categoryId 获取产品?