Firestore и RTDB ведут себя по-разному при попытке прослушивания без rnet. RTDB не запускает никаких слушателей, пока inte rnet не будет восстановлен. Firestore запускает прослушиватель с пустым снимком, поэтому вызов exists () возвращает false. Когда inte rnet восстанавливается, Firestore снова запускается с живыми данными. Это приложение без сохранения на диске, и читаемые поля / документы никогда не записывались до того, как были установлены слушатели.
То, что делает firestore, может сильно сбивать с толку ... Возможно, невозможно сказать действительно ли данные не существуют или что-то еще пошло не так. Это предполагаемое поведение и есть ли способ обойти это?
//first firestore statement in the app
fs.collection("blabla").document("blabla").addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error)
{
if (error == null)
Log.v("TEST", "FS LISTEN EVENT " + value.exists() + " " + value.getData());
if (error != null)
Log.v("TEST", "FS LISTEN ERROR " + error);
}
});
Logcat:
V / TEST: FS LISTEN EVENT false null
After inte rnet восстановлено:
V / TEST: FS LISTEN ERROR com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Отсутствуют или недостаточны разрешения.
EDIT:
Я проверил это сейчас с настойчивостью и без нее. Идентичное поведение, по крайней мере, при первом получении этих данных. Поскольку я не собираюсь использовать постоянство диска, это будет происходить каждый раз при создании действия.
Я могу использовать get () вместо прослушивателя снимков - он возвращает хороший com.google.firebase.firestore. FirebaseFirestoreException: не удалось получить документ, поскольку клиент отключен. Совершенно другое поведение. Но у меня также есть оговорки по поводу get ():
Нет возможности остановить / отменить регистрацию. Поэтому я не могу реализовать тайм-аут для этой операции. Он может сработать, когда приложение приостановлено - или в любой другой неожиданный момент. Нет goOffline с firestore ... Да, я мог бы придумать logi c, чтобы справиться с этим - конечно, это сложно, хотя ...
Так и не получил ответа, проблема с холодным огнем решена. Некоторые люди записывали 90 секунд для get () для получения данных. Для некоторой критически важной части данных, необходимой при загрузке приложения, и невозможности реализовать тайм-аут - как справиться с потоком приложения?