Firebase - извлечение данных по значению во внешнюю переменную - PullRequest
0 голосов
/ 19 мая 2018

У меня есть вопрос, касающийся базы данных Firebase Realtime.

Я пытаюсь сделать закладку в своей программе, которая позволяет пользователю сохранять свои любимые страницы, однако всякий раз, когда я пытаюсь получить данныеиз моей базы данных firebase данные восстанавливаются после того, как метод возвращает значение.

public static boolean checkIfBookmarked(final String title){
    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    final DatabaseReference userBookmarks = FirebaseDatabase.getInstance().getReference().child("users")
            .child(user.getUid()).child("bookmarks");
    final boolean[] exists = new boolean[1];
    userBookmarks.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            exists[0] = dataSnapshot.child(title).exists() ;
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    return exists[0];
}

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Вы не можете вернуть то, что еще не было загружено.Другими словами, вы не можете просто вернуть первый элемент вашего массива exists[0] вне метода onDataChange(), потому что он всегда будет null из-за асинхронного поведения этого метода.Это означает, что к тому времени, когда вы пытаетесь использовать этот результат вне этого метода, данные еще не закончили загрузку из базы данных, и поэтому они недоступны.

Быстрое решение этой проблемы -используйте exists[0] только внутри метода onDataChange(), или если вы хотите использовать его снаружи, я рекомендую вам погрузиться в асинхронный мир и посмотреть последнюю часть моего ответа из этого поста , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова.Вы также можете взглянуть на это видео для лучшего понимания.

0 голосов
/ 19 мая 2018

Firebase использует методы обратного вызова для получения данных с сервера. В вашем случае оператор возврата будет выполнен до того, как обратный вызов поступит от Firbase.Вы можете попытаться передать метод обратного вызова в вашу функцию и выполнить его при срабатывании обратного вызова из Firebase.

public static void checkIfBookmarked(final String title, callbackFunction){
    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    final DatabaseReference userBookmarks = FirebaseDatabase.getInstance().getReference().child("users")
            .child(user.getUid()).child("bookmarks");
    final boolean[] exists = new boolean[1];
    userBookmarks.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            exists[0] = dataSnapshot.child(title).exists() ;
            //execute your callback function here
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    return;
}

Установите этот флажок, чтобы увидеть, как передать функцию в качестве параметра. Передача функции в качестве параметра в java

Альтернативой может быть перемещение вашего кода в метод OnDataChange

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...