如何在不使用childEventListener的情况下从指定子项的特定键获取firebase的值?

时间:2017-07-01 14:17:44

标签: android firebase-realtime-database

我正在编写一个Android应用程序,我需要从之前手动添加的Firebase数据库中检索值。存储在Firebase数据库中的数据不对称,这就是我无法使用类对象的原因。

我想做类似于以下代码的事情。

FirebaseDatabase firebaseDatabase;
DatabaseReference databaseRef;
firebaseDatabase = FirebaseDatabase.getInstance();
databaseRef= firebaseDatabase.getReference().child("child").child("child2");
String value = databaseRef.getValue("key");
//In above line I want to retrieve string at child → child2 → key:"value"

2 个答案:

答案 0 :(得分:2)

虽然建议您不必 使用自定义Java类来获取Firebase中的值。您也可以直接阅读原始类型,如下所示。但无论您使用的是自定义类还是原始类型,您都必须use a listener to read data from the database

FirebaseDatabase firebaseDatabase;
DatabaseReference databaseRef;
firebaseDatabase = FirebaseDatabase.getInstance();
databaseRef= firebaseDatabase.getReference().child("child").child("child2");
databaseRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String value = dataSnapshot.getValue(String.class);
        // ...
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "listener canceled", databaseError.toException());
    }
};

您可以通过这种方式将监听器附加到JSON树中的任何级别,Firebase会将该点下的所有数据同步到DataSnapshot。然后,您可以使用getChild()getValue()方法从快照中获取它。例如,阅读child下的所有内容,但只打印child2

databaseRef= firebaseDatabase.getReference().child("child");
databaseRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String value = dataSnapshot.getChild("child2").getValue(String.class);
        Log.i(TAG, "child2: "+value);
        // ...
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "listener canceled", databaseError.toException());
    }
};

第二个代码段从数据库中读取更多数据,但只从快照中提取child2

答案 1 :(得分:1)

您需要设置ValueEventListener并获取Firebase文档中所写的数据快照

ValueEventListener postListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    // Get Post object and use the values to update the UI
    Post post = dataSnapshot.getValue(Post.class);
    // ...
}

@Override
public void onCancelled(DatabaseError databaseError) {
    // Getting Post failed, log a message
    Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
    // ...
}
};
mPostReference.addValueEventListener(postListener);