实时数据库显示是否仍未上传数据

时间:2019-09-06 18:45:40

标签: android firebase firebase-realtime-database kotlin

所以我正在使用实时数据库,并且正在尝试制作一个聊天应用进行练习。

我想将消息添加到我的列表中,然后让列表中的消息项将消息上载到服务器,我还显示了一个指示器,该指示器告诉用户是否正在上载消息,还有其他方法应用这个,但是无论如何我都想使用这个。

有互联网连接时没有任何问题。问题是当没有任何互联网连接时,该消息被添加到列表中,并且当互联网连接返回时,指示符出现,一切仍然正常。

但是,如果我发送消息(处于脱机状态)然后离开聊天室并返回到聊天室,则消息将被加载,并且指示符也不会出现,即使它没有上传到服务器(数据现在已被缓存)。

我想找到一种方法来判断数据是否已上传?我不想检查服务器是否存在该节点,我不能对每条消息花费太多,谢谢。

2 个答案:

答案 0 :(得分:1)

如果启用磁盘持久性,则Firebase会将所有待处理的写入保留在其磁盘缓存中。当应用重新启动时,它将读取这些未决的写入并开始尝试。这通常是您用户的正确行为。

不幸的是,没有内置的方法可以为实时数据库保留完成处理程序。因此,重新启动后,您将无法检测到何时在服务器上落实了未决写。

因此,这通常意味着您需要做一些自定义操作来检测情况,并且必须自己确定用例是否值得努力。

如果您的消息以某种方式排序/加了时间戳(例如,如果您通过调用push()添加消息),则可以跟踪最后一条消息是从服务器收到的确认消息。这样,您将知道客户端何时重新启动,哪些消息可能尚未发送到服务器。

即使您的应用重新启动,您的onDataChangeonChildAdded 也会立即被那些未确认的消息调用,因此您需要一种附加的机制来检测那些未确认的消息消息写在服务器上。

我知道是否最好的方法是在应用启动时写一条“虚拟”消息。由于挂起的写入被视为先进先出队列,因此在上一次运行中所有挂起的写入之后,新的虚拟消息写入将被发送到服务器。因此,当您的完成处理程序被要求发送此伪消息时,您可以确定之前的所有消息也都已提交(或在它们违反安全规则的情况下被拒绝)。

答案 1 :(得分:0)

Firebase云功能在文件上传到存储设备时触发onFinalize事件。因此,您可能可以编写这样的云函数。

exports.uploadedServer = functions.storage.object().onFinalize((object) => {
  const filename = object.name
  //mark this filename or filekey as upload complete
  return
})

您应该能够找到更多的解释here