首页 > 解决方案 > 查询数据库有对象但getValue()会返回null

问题描述

我将每个唯一值的用户保存到实时火力库中,以在此链接图像上显示:

根据电子邮件获取用户 - 数据库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 即使电子邮件存在。

在此处输入图像描述 在此处输入图像描述

我想知道有什么问题吗?

标签: firebasefirebase-realtime-database

解决方案


编辑:

如果您不想传递 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 -> users -> {userId} -> {name, image, firebase-token, email....}。

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


推荐阅读