【问题标题】:How to get value of Child of childs from firebase in java如何从java中的firebase获取孩子的孩子的价值
【发布时间】:2018-06-05 19:11:37
【问题描述】:

从这里我想从mailID获取电子邮件的值和来自mailText的主题、标题。我能够访问单个孩子的值,但是当它显示为null时,尝试使用所有三个。

以下代码适用于单个孩子:

DatabaseReference databaseRef = database.getReference("/");
    databaseRef.addValueEventListener(new ValueEventListener() {
                 public void onDataChange(DataSnapshot dataSnapshot) {
                    ArrayList<String> email = new ArrayList();
                     for (DataSnapshot sd: dataSnapshot.getChildren()) {
                         String emailStr = sd.child("email").getValue(String.class);
                         email.add(emailStr);
                         System.out.println(email);
                         }
                     latch.countDown();
                     }

上面的代码给了我一个数组,其中包含我想要获取电子邮件、标题和主题值的所有电子邮件。

【问题讨论】:

  • 但是mailIdmailText这两个节点下都有多条记录。你想买哪一个?
  • @AlexMamo 我想要两个孩子的所有记录
  • 请给我们一个您期望结果的具体例子。
  • @AlexMamo 我想从所有孩子那里获取电子邮件、主题和标题的值
  • 在编写代码之前,请告诉我您希望数据按什么顺序显示?给出输出示例。

标签: java android firebase firebase-realtime-database


【解决方案1】:

假设 new 节点是您的 Firebase 根的直接子节点,要实现您在 cmets 中解释的内容,请使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference newRef = rootRef.child("new");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.child("mailID").getChildren()) {
            String email = ds.child("email").getValue(String.class);
            String name = ds.child("name").getValue(String.class);
            Log.d("TAG", email + " / " + name);
        }
        for(DataSnapshot ds : dataSnapshot.child("mailText").getChildren()) {
            String title = ds.child("title").getValue(String.class);
            String subject = ds.child("subject").getValue(String.class);
            Log.d("TAG", title + " / " + subject);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
newRef.addListenerForSingleValueEvent(valueEventListener);

如您所见,您需要在树层次结构的上一级附加一个侦听器,并使用 getChildren() 方法两次循环遍历子级。

【讨论】:

  • @worked 和一个问题,当我使用 String emailStr = sd.child("mailID").child("email").getKey();它工作正常显示键但是当我尝试打印值时它给出空值为什么?
  • 您需要在 for 循环中使用:ds.child("email").getKey()。不客气,干杯!
【解决方案2】:

您需要更改数据库结构(firebase中没有join),才能查询并获取所需的数据:

new
  mailId
     email: userx@gmail.com
     name:userx
     title: test title
     Body: test body

然后您将能够检索用户所需的数据。

您也可以使用Queries来获取相关数据,例如:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("new");
ref.orderByChild("email").equalTo("userx@gmail.com");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-08
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多