Firebase datasnapshot.getValue()返回null

时间:2017-08-23 11:19:52

标签: android firebase firebase-realtime-database getvalue

在我的应用中,我使用了Firebase数据库并在子级中存储了userID,并将子级的值设置为用户名以获取当前用户的用户名。现在我使用addValueEventListener从数据库中获取用户名。这是我的Firebase结构。Database Structure

代码如下。

checkUsername.child("check").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                currentUser = dataSnapshot.child(getUserID()).getValue(String.class);
                Log.d(TAG, "onDataChange: currentUser = " + currentUser);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

调试时,String currentUser返回null。

已调试答案的屏幕截图。Debugged Answer

2 个答案:

答案 0 :(得分:0)

由于您已在check节点添加了valueEventListener,因此再次获取子节点是没有意义的(因为用户ID是check节点的关键而不是单独的子节点。)

而是尝试直接调用dataSnapshot.getChildren();来获取更新数据的完整列表并迭代它以获得您需要的任何键值。

像这样,

checkUsername.child("check").addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
       String current value = dataSnapshot.getValue(String.class); 
        Log.d("TAG", "onDataChange: " + current value);
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) {}

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {}

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {}

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

此特定用例中的另一个选项是添加ChildEventListener并在onChildAdded()方法中获取值。

答案 1 :(得分:-2)

伙计们我找到了答案。在问到这个问题之前,我只使用了compile 'com.google.firebase:firebase-core:11.0.4'我的firebase依赖项。现在我已将compile 'com.google.firebase:firebase-database:10.0.1'添加到我的依赖项中,现在它可以正常运行...