我在Android上使用Firebase的实时数据库,我理解它的工作原理是,即使应用程序与网络断开连接,Firebase也会简单地对用户已启动的事务进行排队,然后在恢复连接时执行 . 这非常有效,但如果应用程序关闭,则此队列似乎被丢弃 .
有关处理脱机功能的Firebase文档说明了以下内容:
跨应用程序重新启动不会保留事务即使启用了持久性,也不会在应用程序重新启动时保留事务 . 因此,您不能依赖离线提交到Firebase实时数据库的事务 . 为了提供最佳用户体验,您的应用应该会显示尚未将事务保存到您的Firebase实时数据库中,或者确保您的应用会手动记住它们并在应用重新启动后再次执行它们 .
但据我所知,无法知道数据是否已完成写入数据库 .
您是如何准确地手动记住仍然需要写入数据库的内容?有没有办法访问尚未执行的事务队列?或者是否有某种方法可以在关闭后保持应用程序在后台运行,这可以在连接恢复时同步数据?
提前致谢 .
2 回答
实际上有 .
Transaction.Handler
接口有[onComplete
方法]([https://firebase.google.com/docs/reference/android/com/google/firebase/database/Transaction.Handler.html#onComplete(com.google.firebase.database.DatabaseError](https://firebase.google.com/docs/reference/android/com/google/firebase/database/Transaction.Handler.html#onComplete(com.google.firebase.database.DatabaseError),boolean,com.google.firebase.database.DataSnapshot)) . 传递给该参数的boolean
是一个标志,用于指示事务是否已提交:有关更多信息,请参阅Firebase documentation on transactions .
我想我遇到了你遇到的问题,在我的情况下是一个简单的混乱 . Firebase警告通常与“交易”无关,是关于他们提供的“交易”方法 .
在Android中,这是
reference().runTransaction()
.“事务”方法首先用于验证数据,例如,如果多个用户可以同时订阅事件,则可以确保最后一个空置可用 .
由于“事务”方法查询数据库为您提供数据和上传数据,如果没有网络连接,则无法确保在重新启动应用程序时,因为从来没有第一个查询来查看数据必须验证 .
这对我来说似乎合乎逻辑,“事务”方法会在客户端和数据库之间创建一种桥梁,这不是随机的,但因为是业务逻辑的一部分,那么你应该直观地警告用户他们的更改可能不是因为它处于脱机状态而被保存,或者即使它是敏感的,也不允许用户这样做 .
在其他情况下,数据确实存储在本地,然后在重新启动应用程序时上传 . 所以,如果你做的事情
reference.child(key).setValue(myObject);
在下次用户连接互联网之前,Thant的更改将是本地的 .
您必须确保将
keepSynced
添加到您实际需要的参考中 . 将同步设置为根目录不会像瀑布一样解决问题,请确保特定于需要保持同步的节点,这样用户将看到应用程序中可视化反映的更改 .