我将每个唯一值的用户保留在实时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,即使存在电子邮件也是如此。
我想知道怎么了?
答案 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(),即使在日志中也是如此,以避免空指针异常。