Не могу прочитать базу данных Firebase, данные возвращают ноль - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь получить конкретного пользователя из базы данных, но не могу, также я хотел бы проверить, существует ли уже узел с таким именем (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 является асинхронным, пользователь еще не был загружен, поэтому он конфликтует с кодом.

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Добро пожаловать в Сообщество.

Когда вы вызывали свою функцию для чтения пользовательского контента?

это может быть асинхронная проблема.

Чтобы убедиться, создайте функцию, в которой пользователь является параметром, и вызовите ее, как только вы прочитаете что-то из БД (onDataChange).

Плюс, вы пытались распечатать то, что внутри? «пользователь», когда вы читаете это? если он дает ноль, проблема точно в пути. Если это так, используйте .child ("users"). Child (currentUser.getUid ())

0 голосов
/ 02 октября 2019

Добро пожаловать в Сообщество SO

Пожалуйста, используйте метод .child() вместо каскадных узлов с "/", как показано ниже. Также проверьте, не является ли значение datasnapshot нулевым, используя метод .exists()

* 1006. *

Не стесняйтесь, если вам нужна дополнительная поддержка

ОБНОВЛЕНИЕ

Пожалуйста, замените вашего слушателя ниже

currentUser = FirebaseAuth.getInstance().getCurrentUser();
mUserReference = FirebaseDatabase.getInstance().getReference.child("users").child(currentUser.getUid());

Query query = FirebaseDatabase.getInstance().getReference.child("users").orderByKey() 
        .equalTo(currentUser.getUid()); 

query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) { // dataSnapshot contains set of returned result of the query
            User user = singleSnapshot.getValue(User.class);
            if (user != null) {
                dataStatus.dataIsLoaded(user);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...