【问题标题】:Firebase realtime database Error getting data, Client is offlineFirebase 实时数据库 获取数据时出错,客户端离线
【发布时间】: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 中抛出了什么异常吗?

标签: android firebase kotlin firebase-realtime-database


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-30
      • 2021-05-01
      • 1970-01-01
      • 2017-08-06
      • 2023-02-23
      • 2018-12-29
      • 2019-07-10
      • 2021-08-10
      相关资源
      最近更新 更多