Firebase Realtime возвращает ноль, но данные существуют

Я сталкиваюсь с проблемой, связанной с базой данных Firebase Realtime и, в частности, слушателем события value, который запускается более одного раза. Кажется, что когда состояние Интернета меняется с несколько раз на выключенное, и устройство наконец-то имеет стабильное соединение onDataChange(DataSnapshot dataSnapshot) Метод обратного вызова слушателя вызывается с dataSnapshot нулевого содержимого. Кажется, что база данных реального времени ссылается на локальный кеш приложения, и в этом случае у меня нет никаких данных, хранящихся в нем. Я присоединяю слушателя внутри Activity onStart() или когда устройство установило какое-то соединение; Я отсоединяю слушателя внутри метода Activity onStop() или когда устройство теряет подключение к Интернету. За один раз существует только один экземпляр данного слушателя, и каждое присоединение имеет соответствующее действие отсоединения, выполняемое при необходимости. Я пытался подождать некоторое время между изменением состояний соединения, прежде чем подключать прослушиватель, и повторно подключить прослушиватель, если datasnapshot возвращает ноль. Ни один из них не сработал. Пожалуйста, посоветуйте решение.

Пример кода внутри Activity:

private ValueEventListener listener;
private Query query;
private boolean hasAttachedListener;

private Query getDatabaseReference() {

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
    return reference.child(“some child ref”)
            .child(“other child ref 2 ”);
}

private ValueEventListener getDatabaseListener() {

    return new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            Log.d(“firebase”, dataSnapshot.toString());
    //issue here datasnapshot is null sometimes
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.d(“firebase”, databaseError.getDetails());
        }
    };
}


/**
 * Attaches  listener
 */
public void addListener() {

    if (!hasAttachedListener) {
        query = getDatabaseReference();
        listener = getDatabaseListener();
        query.addValueEventListener(listener);
        hasAttachedListener = true;
    }
}

/**
 * Detaches the attached listener
 */
public void removeListener() {

    if (hasAttachedListener) {
        query.removeEventListener(listener);
        query = null;
        listener = null;
        hasAttachedListener = false;
    }
}

@Override
protected void onStart() {
    super.onStart();
    addListener();
}

@Override
protected void onStop() {
    super.onStop();
    removeListener();
}

@Override
protected void onNetworkDisconnected() {
    super.onNetworkDisconnected();
    // invoked when internet connection is lost 
    removeListener();

}

@Override
protected void onNetworkReconnected() {
    super.onNetworkReconnected();
    // invoked when internet connection is restored 
    addListener();
}

2 ответа

Новые данные должны иметь уникальное имя, чтобы предотвратить замену существующих

С возможностями автономной работы Firebase вам не нужно использовать эти два метода для прослушивания, если нет соединения с базой данных

Так что ваши onNetworkDisconnected а также onNetworkReconnected не нужны

проверьте документы Firebase здесь: https://firebase.google.com/docs/database/android/offline-capabilities

Хранение данных свежим

База данных Firebase Realtime синхронизирует и хранит локальную копию данных для активных слушателей. Кроме того, вы можете синхронизировать определенные места.

DatabaseReference scoresRef = FirebaseDatabase.getInstance().getReference("scores");
scoresRef.keepSynced(true);

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

Другие вопросы по тегам