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