Firebase 实时数据库 获取数据时出错,客户端离线
Posted
技术标签:
【中文标题】Firebase 实时数据库 获取数据时出错,客户端离线【英文标题】:Firebase realtime database Error getting data, Client is offline 【发布时间】:2021-12-10 08:22:04 【问题描述】:我正在尝试使用以下代码从实时数据库中检索数据。我想在 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)
【问题讨论】:
你希望代码做什么?为什么你认为你得到的结果不正确? 你检查你的权限规则了吗?是否允许您的应用读取该集合? @FrankvanPuffelen 我试图在 textview 中显示来自 firebase 实时数据库的用户的一些信息,但它没有显示任何内容,并且 logcat 显示了该错误。 @KathanPatel 你指的是我们允许用户读写数据的firebase规则吗?我已经做到了。 是的,我指的是同一个。你检查过它在 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\@firebase\database\dist\exp\index.esm2017.js:11172:22 in repo.server_.get.then$argument_1
at node_modules\react-native\node_modules\promise\setimmediate\core.js:37:13 in tryCallOne
at node_modules\react-native\node_modules\promise\setimmediate\core.js:123:24 in setImmediate$argument_0
at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:130:14 in _callTimer
at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:181:14 in _callImmediatesPass
at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:441:30 in callImmediates
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:387:6 in __callImmediates
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:135:6 in __guard$argument_0
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:364:10 in __guard
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:134:4 in flushedQueue
如果我在最初失败后再次调用 get(),它会起作用! 所以我回去阅读了 firebase 文档。我最终登陆了Enable Offline Capabilities - Kotlin 页面。在Detecting Connection State - Kotlin 上有一个部分。在成功的 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 here/
为了修复它,我只是指定了这样的服务器:
FirebaseDatabase.getInstance("YOUR_URL_HERE")
可以在您的 Firebase 控制台中找到参数“YOUR_URL_HERE”。例如:
screenshot
【讨论】:
以上是关于Firebase 实时数据库 获取数据时出错,客户端离线的主要内容,如果未能解决你的问题,请参考以下文章
第一次调用时捕获 Firebase 实时observeSingleEvent 数据失败
无法从 firebase 回收器视图中的 firebase 实时数据库中获取嵌套数据
Firebase 实时数据库获取函数返回未定义(较新的 firebase 版本,2021) - 使用 React Native