查询数据库时有对象,但getValue()将返回null

时间:2019-01-17 15:17:44

标签: firebase firebase-realtime-database

我将每个唯一值的用户保留在实时Firebase中,如以下链接图像所示:

get user according to email - database firebase

我想通过电子邮件获取用户,所以我尝试这样做:

 private void getUserFromRealtimeFirebase(String email) {
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    mDatabaseReference = mFirebaseDatabase.getReference().child("user");
    Query query = mDatabaseReference.orderByChild("email").equalTo(email);

    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Log.i("TAG", "dataSnapshot value = " + dataSnapshot.getValue().toString());

            if (dataSnapshot.exists()) {
                Log.d("Tag", "user exists"); 
            }
        }

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

        }
    });
}

但是我总是遇到回调监听器:dataSnapshot:key = user,value = null,即使存在电子邮件也是如此。

enter image description here enter image description here

我想知道怎么了?

1 个答案:

答案 0 :(得分:2)

编辑:

如果您不想传递userId,请使用以下查询:

mDatabaseReference = mFirebaseDatabase.getReference();
Query query = mDatabaseReference.orderByChild("user/email").equalTo(email);

您缺少用户ID级别。 您应该将代码更改为:

private void getUserFromRealtimeFirebase(String email, String userId) {
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    mDatabaseReference = mFirebaseDatabase.getReference().chlid(userId).child("user");
    Query query = mDatabaseReference.orderByChild("email").equalTo(email);
...
...
}

顺便说一句,我会考虑将数据结构重新安排为- newsapp->用户-> {userId}-> {名称,图片,firebase令牌,电子邮件......}。

此外,在回调上-首先检查dataSnapshot.exists(),然后才使用getValue(),即使在日志中也是如此,以避免空指针异常。