# #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. Например: