【问题标题】:Android Firebase Retrieving data as a list from multiple nodsAndroid Firebase 从多个节点中检索数据作为列表
【发布时间】:2020-11-24 14:32:49
【问题描述】:

我在我的第一个 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) {

            }
        });

【问题讨论】:

    标签: android firebase firebase-realtime-database data-retrieval


    【解决方案1】:

    让我们使用 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) {
        
                    }
        });
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多