如何从有多个孩子的firebase中提取数据?

时间:2019-01-11 07:38:30

标签: android firebase android-layout firebase-realtime-database

我正在尝试从Firebase实时数据库中提取数据。我在这里面临的问题是我可以成功地从/ ItemList中提取数据,但是当我尝试从/ ItemRequest中提取数据时,数据无法被提取,但是当我给它指定诸如/ ItemRequest / admin之类的特定路径时,它就可以工作。我正在尝试用管理员和用户的/ ItemRequest中的所有子项填充列表视图。我正在使用Firebase列表适配器填充列表视图,所以有什么方法可以做我想要的吗?

数据库布局

enter image description here

2 个答案:

答案 0 :(得分:2)

  

我想做的是用管理员和用户的/ ItemRequest中的所有子项填充listview。

要解决此问题,您需要对DataSnapshot对象进行两次迭代,如以下代码行所示:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference itemRequestRef = rootRef.child("ItemRequest");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
            for(DataSnapshot ds : dSnapshot.getChildren()) {
                String productName = ds.child("ProductName").getValue(String.class);
                Log.d(TAG, productName);
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
itemRequestRef.addListenerForSingleValueEvent(valueEventListener);

您的logcat中的输出将是:

Manix
Manix
Manix

如果您想在ListView中显示这些结果,请参阅我在这篇文章中的回答:

答案 1 :(得分:0)

AFAIK,FirebaseListAdapter不适用于本身具有多个子级的子级对象,并且没有查询方法可以将其过滤掉。我宁愿使用DataSnapshots逐一手动拉出子项,然后将它们添加到arraylist中,然后使用自定义数组适配器填充该列表