【问题标题】:How to retrieve an array data inside an array from firebase database: Android如何从 firebase 数据库中检索数组中的数组数据:Android
【发布时间】:2017-05-23 16:03:43
【问题描述】:

这是我在 Firebase 数据库中的 JSON 数据结构:

familylist
     |- 0
        |--children
        |   |-- 0:"AAA"
        |   |-- 1:"BBB"
        |-- code: "2222"
        |-- family: "SWE"
        |-- fatherName: "ABC"
        |-- motherName: "XYZ"
     |- 1
        |--children
        |   |-- 0:"XXX"
        |   |-- 1:"YYY"
        |-- code: "3333"
        |-- family: "ABC"
        |-- fatherName: "ERT"
        |-- motherName: "XTS"

我能够从 JSON 树中提取除 children 之外的所有字段。谁能建议我如何从children 检索数据?

这是我从 firebase 数据库中检索除子项之外的所有字段的代码。为了检索children 值,可以对这段代码做什么?我无法弄清楚。

familyListReference.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot ds: dataSnapshot.getChildren()) {
      String key = (String) ds.getKey();
      Log.d(TAG, "Key" + key);
      DatabaseReference keyReference = FirebaseDatabase.getInstance().getReference().child("familylist").child(key);
      Log.d(TAG, "Key reference: " + keyReference);
      keyReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
          String code = dataSnapshot.child("code").getValue(String.class);
          String family = dataSnapshot.child("family").getValue(String.class);
          String father = dataSnapshot.child("fatherName").getValue(String.class);
          String mother = dataSnapshot.child("motherName").getValue(String.class);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
          Log.d(TAG, "Read failed");
        }
      }); // [End of keyReference]

    } // END of for Loop
  }

  @Override
  public void onCancelled(DatabaseError databaseError) {
    Log.d(TAG, "Read failed");
  }
}); // [End of familyListDatabaseReference]

【问题讨论】:

    标签: android json firebase firebase-realtime-database


    【解决方案1】:

    由于children 是一个列表,您可能正在寻找:

    public void onDataChange(DataSnapshot dataSnapshot) {
      for (DataSnapshot childSnapshot: dataSnapshot.child("children").getChildren()) {
        System.out.println(childSnapshot.getValue(String.class));
      }
    }
    

    请注意,Firebase 文档建议不要将数组用于此类列表,例如 this blog post。相反,它推荐using push() to populate lists

    【讨论】:

    • 完美无瑕!实际上,我已经将一个现有的 JSON 文件导入到 firebase 数据库,并从那里从 Activity 中提取数据。
    【解决方案2】:

    在您的 onDataChange() 方法中添加这行代码,在这 4 个字符串的声明之后:

          String code = dataSnapshot.child("code").getValue(String.class);
          String family = dataSnapshot.child("family").getValue(String.class);
          String father = dataSnapshot.child("fatherName").getValue(String.class);
          String mother = dataSnapshot.child("motherName").getValue(String.class);
          for (DataSnapshot ds : dataSnapshot.child("children").getChildren()) {
              Log.d("TAG", ds.getValue(String.class));
          }
    

    希望对你有帮助。

    【讨论】:

    • 在其他节点,我有 3 个孩子。我不能像这样手动硬编码吧?
    • 我不知道,是的,你是对的,但我在上面的示例中的每个节点中只看到了 2 个子节点。所以为了解决这个问题,请添加 Frank van Puffelen 建议的那些行。
    • 太棒了!为我工作!
    • 很高兴听到这个消息。干杯!
    【解决方案3】:

    如果您实际上不知道您有多少个孩子,我认为我的解决方案比其他用户之前建议的解决方案更好。

    List<String> children = dataSnapshot.child("children").getValue(new GenericTypeIndicator<List<String>>(){});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多