问题检索Firebase的类似子元素

时间:2018-09-07 07:11:45

标签: android firebase firebase-realtime-database

我想一次只检索日期和所有date元素,并将它们存储在firebase中的数组中,如下所示。

enter image description here

我使用以下代码进行检索,但未能成功。

    public void showData(View view) {

    final ArrayList<String> date = new ArrayList<>();
    firebaseDatabase = FirebaseDatabase.getInstance().getReference().child("Date");

    firebaseDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            date.add(dataSnapshot.getValue().toString());
            display.setText(dataSnapshot.getValue().toString());
        }

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

        }
    });
}

请帮助找到解决方案。

2 个答案:

答案 0 :(得分:1)

firebase参考错误,您应该从顶部节点转到日期节点。

更改此:

firebaseDatabase = FirebaseDatabase.getInstance().getReference().child("Date");

对此:

firebaseDatabase = FirebaseDatabase.getInstance().getReference().child("Name");
 firebaseDatabase.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
       for(DataSnapshot datas: dataSnapshot.getChildren()){
        date.add(datas.child("Date").getValue().toString());
           }
    }

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

    }
});

由于您想获得全部 Date,然后将Firebase引用放在节点Name上并在名称中循环以能够检索所有日期。


如果要获取一个用户示例Ravi的日期,则不需要循环,可以执行以下操作:

firebaseDatabase = FirebaseDatabase.getInstance().getReference().child("Name").child("Ravi").child("Date");

firebaseDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    date.add(dataSnapshot.getValue().toString());
       }
}

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

    }
 });

答案 1 :(得分:0)

如@PeterHaddad在上一个答案中所述,访问您获取的数据的顺序不正确。如果到目前为止没有其他帮助,您可以尝试这种方式。

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("Names").orderByChild("Date").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
       for(DataSnapshot ds: dataSnapshot.getChildren()){
        date.add(ds.getValue(String.class));
           }
    }

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

    }
});

//Also as you've told that code is not working, please tell, what exactly is not working