在singlevalueeventlistener上检索Firebase实时数据库中的子元素?

时间:2018-08-15 05:03:36

标签: java android firebase firebase-realtime-database

我的Firebase数据结构enter image description here

我尝试过:

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("test1");
    reference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String name = dataSnapshot.getValue(String.class);
            Log.d("TAG", name);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });

但无法正常工作。

2 个答案:

答案 0 :(得分:1)

首先创建一个类:

public class MyClass {
    private String name;

    public MyClass() {
        // Default constructor required for calls to DataSnapshot.getValue(MyClass.class)
    }

    public String getName() {
         return name;
    }
}

然后按如下所示更新代码:

String myInstance = dataSnapshot.getValue(MyClass.class);
String name = myInstance.getName();

答案 1 :(得分:0)

@Mehmed的答案将非常有用,但是有替代方法。

如果您不想创建Java包装器类,也可以直接从.访问该属性:

a = r'\frac...'

与您的代码的不同之处在于增加了DataSnapshot调用,这意味着我们从JSON获取public void onDataChange(DataSnapshot dataSnapshot) { String name = dataSnapshot.child("name").getValue(String.class); Log.d("TAG", name); } 属性的值。

另一种选择是使用以下方法将侦听器直接附加到child("name")属性:

name

最后一个示例的优势在于,即使稍后在name下添加更多子属性,它也仅检索DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("test1"); reference.child("name").addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String name = dataSnapshot.getValue(String.class); Log.d("TAG", name); } @Override public void onCancelled(DatabaseError databaseError) { throw databaseError.toException(); } }); 属性。