Ошибка базы данных Firebase в реальном времени при получении данных, клиент отключен

# #android #firebase #kotlin #firebase-realtime-database

Вопрос:

Я пытаюсь извлечь данные из базы данных в реальном времени с помощью приведенного ниже кода. Я хочу отобразить эти данные в textview, но, к сожалению, они не отображаются в logcat, я получил сообщение об ошибке, как показано ниже. Я думаю, что код в порядке, но, возможно, что-то не так с firebase или что-то связано с firebase. пожалуйста, помогите!

 private fun getStudentData(){
    database = FirebaseDatabase.getInstance().getReference("users")
    database.child(uid).get().addOnSuccessListener {
        val studentName = it.child("name").value
        val studentBio = it.child("bio").value

        binding.tvStudentName.text = studentName.toString()
        binding.tvStudentBio.text = studentBio.toString()
    }.addOnFailureListener{
        Log.e("firebase", "Error getting data", it)
    }
}
 
 2021-10-24 21:59:22.498 30028-30028/com.example.amazontutoringcenter E/firebase: Error getting data
    java.lang.Exception: Client is offline
        at com.google.firebase.database.connection.PersistentConnectionImpl.lambda$get$1$PersistentConnectionImpl(PersistentConnectionImpl.java:441)
        at com.google.firebase.database.connection.PersistentConnectionImpl$ExternalSyntheticLambda4.run(Unknown Source:8)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:929)
 

введите описание изображения здесь

Комментарии:

1. Чего вы ожидали от кода? Как вы думаете, почему полученный результат неверен?

2. Вы проверили свои правила разрешений? Разрешено ли вашему приложению читать эту коллекцию?

3. @FrankvanPuffelen Я пытался отобразить некоторую информацию о пользователях из базы данных firebase realtime в textview, но она ничего не отображала, и logcat показал эту ошибку.

4. @KathanPatel вы ссылались на правило firebase, согласно которому мы разрешаем пользователям записывать и считывать данные, верно? Я уже сделал их верными.

5. Да, я имел в виду то же самое. Вы проверили, какое исключение он выдает в addOnFailureListener?

Ответ №1:

Я столкнулся с этой ошибкой при работе с React Native / Expo (v42.0.1), Firebase (v9.4.0) и Realtime DB. Код будет работать безупречно на виртуальных машинах Android…

 const queryRef = query(ref(database, "..."));
get(queryRef)
  .then((snapshot) => {
    if (snapshot.exists()) {...} 
    else {...}
  })
  .catch((err) => {...});
 

но с этой ошибкой на физических устройствах Android произойдет сбой…

 Error: Client is offline.
at node_modules@firebasedatabasedistexpindex.esm2017.js:11172:22 in repo.server_.get.then$argument_1
at node_modulesreact-nativenode_modulespromisesetimmediatecore.js:37:13 in tryCallOne
at node_modulesreact-nativenode_modulespromisesetimmediatecore.js:123:24 in setImmediate$argument_0
at node_modulesreact-nativeLibrariesCoreTimersJSTimers.js:130:14 in _callTimer
at node_modulesreact-nativeLibrariesCoreTimersJSTimers.js:181:14 in _callImmediatesPass
at node_modulesreact-nativeLibrariesCoreTimersJSTimers.js:441:30 in callImmediates
at node_modulesreact-nativeLibrariesBatchedBridgeMessageQueue.js:387:6 in __callImmediates
at node_modulesreact-nativeLibrariesBatchedBridgeMessageQueue.js:135:6 in __guard$argument_0
at node_modulesreact-nativeLibrariesBatchedBridgeMessageQueue.js:364:10 in __guard
at node_modulesreact-nativeLibrariesBatchedBridgeMessageQueue.js:134:4 in flushedQueue
 

Если бы я снова вызвал get() после первоначального сбоя, это сработало бы!
Итак, я вернулся и прочитал документы firebase. В конце концов я попал на страницу включения автономных возможностей — Kotlin. Существует раздел об обнаружении состояния соединения — Kotlin. После обертывания моего кода в инструкции success if моя проблема была решена!

 val connectedRef = Firebase.database.getReference(".info/connected")
connectedRef.addValueEventListener(object : ValueEventListener {
    override fun onDataChange(snapshot: DataSnapshot) {
        val connected = snapshot.getValue(Boolean::class.java) ?: false
        if (connected) {
            Log.d(TAG, "connected")

            //DB is ready for get() call 

        } else {
            Log.d(TAG, "not connected")
        }
    }

    override fun onCancelled(error: DatabaseError) {
        Log.w(TAG, "Listener was cancelled")
    }
})
 

Примечание: я заметил, что при использовании этого подхода «не подключен» всегда вызывается перед «подключен». Это сделало обработку ошибок интересной.

Ответ №2:

У меня это не сработало, потому что я не указал URL-адрес сервера при получении экземпляра базы данных. Помимо этой ошибки я получал это в консоли :

Соединение с базой данных Firebase было принудительно прервано сервером. Не будет пытаться повторно подключиться. Причина: база данных находится в другом регионе. Пожалуйста, измените URL-адрес вашей базы данных на /my database url здесь/

Чтобы исправить это, я просто указал сервер таким образом:

  FirebaseDatabase.getInstance("YOUR_URL_HERE")
 

Параметр «YOUR_URL_HERE» можно найти в консоли firebase. Например:

скриншот