Android Firebase 从多个节点中以列表形式检索数据

Android Firebase Retrieving data as a list from multiple nods

我在我的第一个 android 应用程序中使用 firebase 实时数据库。我正在尝试从 firebase 检索数据作为“用户名”的数组列表,但我不断让查询返回 null 结果。我是 firebase 的新手,所以我一直在为数据检索错误而苦苦挣扎。

"Marchand" : {
    "Taha" : {
      "adress" : "58 avenu St Eugène ",
      "blockage" : false,
      "latitude" : 35.7498635,
      "longitude" : -0.5566705,
      "mail" : "mailmail@gmail.com ",
      "password" : "123456",
      "signalement" : 0,
      "telephone" : "0666666666",
      "username" : "Taha"
    },
    "Yasmine" : {
      "adress" : "Address kkdndbdk ",
      "blockage" : false,
      "latitude" : 35.7498636,
      "longitude" : -0.5566704,
      "mail" : "randommail@gmail.com",
      "password" : "bobo",
      "signalement" : 0,
      "telephone" : "06999999",
      "username" : "Yasmine"
    }
.
.
.

这是我的尝试之一,我尝试使用 order-by-child 方法来遍历我拥有的多个点头,但我确信这不是正确的方法,这给了我空指针异常,因为数据快照返回 NULL 值:

 referenceMarchand = rootNode.getReference("Marchand");
final ArrayList<String> types = new ArrayList<>();
        Query users =  referenceMarchand.orderByChild("username");

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

                types.add(dataSnapshot.child("username").toString());

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

让我们使用 firebase 的一些功能,让我们看看它是否适合您。

第 1 部分

我们将以另一种方式保存它

"Merchant" : {"Name" : "Taha"
"ID" :"-KSMCMCMnnkd"},//Firebase generated id
{"Name" : "Yasmine"
"ID" :"-KSMCMccccnkd"},//Firebase generated Id
...........

第 2 部分

并保存详细信息

"Details" : {
      "ID" : "-KSMCMCMnnkd" //Firebase generated id
      "adress" : "58 avenu St Eugène ",
      "blockage" : false,
      "latitude" : 35.7498635,
      "longitude" : -0.5566705,
      "mail" : "mailmail@gmail.com ",
      "password" : "123456",
      "signalement" : 0,
      "telephone" : "0666666666",
      "username" : "Taha"},
      {
      "ID":"-KSMCMccccnkd" //Firebase generated id
      "adress" : "Address kkdndbdk ",
      "blockage" : false,
      "latitude" : 35.7498636,
      "longitude" : -0.5566704,
      "mail" : "randommail@gmail.com",
      "password" : "bobo",
      "signalement" : 0,
      "telephone" : "06999999",
      "username" : "Yasmine"}
  

第 1 部分

DatabaseRefrence ref = FirebaseDatabase.getInstance("/Path");
String id = ref.child("Merchant").push().getKey(); //Firebase generated id
Merchant merchant = new Merchant();
merchant.setId(id);
merchant.setName("SomeName");
ref.child("Merchant").child(id).setValue(merchant);

第 2 部分

Detail detail = new Detail();
detail.setAddress("Some Address");
detail.setBlockage("false");
detail.setLatitude("SomeValue");
detail.setEmail("someText@gmail.com");
......
ref.child("Details").child(id).setValue(detail);

现在

List<Merchant> merchants = new ArrayList<>();
List<Detail> details = new ArrayList<>();
ref.child("Merchant").addValueEventListener(new ValueEventListener(){
@Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

               for(Datasnapshot snapshot:dataSnapshot){
                  Merchant merchant = snapshot.getValue(Merchant.class);
                  merchants.add(merchant);
}

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
});

ref.child("Details").addValueEventListener(new ValueEventListener(){
    @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    
                   for(Datasnapshot snapshot:dataSnapshot){
                      Detail detail = snapshot.getValue(Detail.class);
                      details.add(detail);
    }
    
                }
    
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
    
                }
    });

现在您可以获取某个商户的详细信息或将其保存在本地数据库中以供以后查询。