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

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

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

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

private Query getDatabaseReference() {

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
    return reference.child(a€?some child refa€?)
            .child(a€?other child ref 2 a€?);
}

private ValueEventListener getDatabaseListener() {

    return new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            Log.d(a€?firebasea€?, dataSnapshot.toString());
    //issue here datasnapshot is null sometimes
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.d(a€?firebasea€?, 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();
}

android,firebase,null,real-time-updates,

0

Ответов: 2


0

При использовании автономных возможностей 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 автоматически загружает данные в этих местах и ??синхронизирует их, даже если в ссылке нет активных слушателей. Вы можете отключить синхронизацию со следующей строкой кода.


0

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

андроид, firebase, NULL, в режиме реального времени-обновления,
Похожие вопросы