如何从Firebase实时数据库获取下一个孩子的数据并将其显示在列表视图中

时间:2019-07-17 11:48:54

标签: java android firebase firebase-realtime-database

我正在开发一个音频圣训,现在我想将第一个键显示为RamadanZakat等类别,并且在每个类别中,都有很多音频圣训的标题和音频URL。

这是数据库结构图:

image

public  void readHadiths(final DataStatus dataStatus){

        mDbReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

               hadiths.clear();

               List<String> keys = new ArrayList<>();

               for (DataSnapshot keyNode : dataSnapshot.getChildren()){

                        keys.add(keyNode.getKey());
                        String title = keyNode.child("title").getValue(String.class);
                        Hadith Hadits = keyNode.getValue(Hadith.class);
                        hadiths.add(Hadits);
                   Log.d("TAG", title);
               }
                dataStatus.DataLoaded(hadiths,keys);
            }

1 个答案:

答案 0 :(得分:1)

您无法查询您的实际数据库结构以一次性获得所有Hadith对象,因为这些对象中的每一个都存在于单独的节点中。为了解决这个问题,我建议您通过减少这样的节点数来更改数据库结构:

Firebase-root
    |
    --- Hadiths
          |
          --- hadith1
          |     |
          |     --- title: "This is hadith1 title"
          |     |
          |     --- url: "eg.example.com"
          |     |
          |     --- type: "Ramadan"
          |
          --- hadith2
                |
                --- title: "This is hadith2 title"
                |
                --- url: "eg.example.com"
                |
                --- type: "Zakat"

现在,要查询所有斋月的圣训,请使用以下查询:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("Hadiths").orderByChild("type").equalTo("Ramadan");
query.addListenerForSingleValueEvent(/* ... */);