Я пытаюсь получить конкретного пользователя из базы данных, но не могу, также я хотел бы проверить, существует ли уже узел с таким именем (uid). Я не хочу получать весь список пользователей, а затем извлекать его из него, потому что я не думаю, что это хорошо для производительности, моя идея состоит в том, чтобы напрямую получить пользователя из базы данных
Я пробовал много способовно все, что я пытаюсь вернуть, возвращает ноль, я не могу получить значения из dataSnapshot. Я использую интерфейс, чтобы убедиться, что я выполняю код после того, как чтение завершено
currentUser = FirebaseAuth.getInstance().getCurrentUser();
mUserReference = FirebaseDatabase.getInstance().getReference("users/"+currentUser.getUid());
mUserReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
user = dataSnapshot.getValue(User.class);
dataStatus.dataIsLoaded(user);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
Здесь интерфейс
public interface DataStatus{
void dataIsLoaded(User user);
}
И когда я пытаюсь получить пользователя, он показывает NullPointerException
UserUtils userUtils = new UserUtils();
userUtils.getUser(new UserUtils.DataStatus() {
@Override
public void dataIsLoaded(User user) {
mUser = user;
}
});
Создание пользователя, когда я вызываю этот метод, я делаю uid = currentUser.getUid()
public void createNewUser(String uid, String name, String email, DataStatus dataStatus) {
mUserReference = mDatabase.child("users").child(uid);
mUserReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
user = new User(name, email);
mDatabase.child("users").child(uid).setValue(user);
dataStatus.dataIsLoaded(user);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
Здесь правила
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
Вот как моя база данныхорганизованный
решен Проблема заключалась в куске кода, который я здесь не включил, который пытался получить доступ к пользователю вне метода интерфейса dataIsLoaded
,и поскольку onDataChange
является асинхронным, пользователь еще не был загружен, поэтому он конфликтует с кодом.