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

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

Пример кода внутри 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();
}

person metodieva    schedule 10.07.2018    source источник
comment
перейдите по этой ссылке simpleifiedcoding.net/firebase-realtime-database-crud   -  person Android Team    schedule 10.07.2018
comment
Привет, предоставленная ссылка является руководством. У меня есть работающее приложение со службами Firebase! Проблема заключается в неверной информации о кешировании прослушивателя событий. Я связался со службой поддержки Firebase по поводу этой проблемы, и они подтвердили, что я правильно использую функцию обновления в реальном времени, но они не смогли помочь.   -  person metodieva    schedule 10.07.2018
comment
Пожалуйста, добавьте код, который вы используете.   -  person Alex Mamo    schedule 10.07.2018
comment
Добавлен код @AlexMamo   -  person metodieva    schedule 10.07.2018
comment
Вы пытались удалить onNetworkDisconnected и onNetworkReconnected, потому что эти методы не нужны?   -  person Alex Mamo    schedule 10.07.2018


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

person Gastón Saillén    schedule 10.07.2018

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

person Constantin Chernishov    schedule 24.07.2018