Firebase:setPersistenceEnabled和keepSynced有什么区别?

Rel*_*elm 22 android persistence firebase firebase-realtime-database

我以为我使用以下所有聊天对话数据的时间都可以随时离线使用.以某种方式不是,所有节点都从服务器加载.

FirebaseDatabase.getInstance().setPersistenceEnabled(true);
Run Code Online (Sandbox Code Playgroud)

然后,根据DOCS:

持久性行为:通过启用持久性,我们在线同步的任何数据都将持久保存到磁盘并可脱机使用,即使我们重新启动应用程序也是如此.这意味着我们的应用程序将使用存储在缓存中的本地数据在线工作.

如果数据已经脱机可用 setPersistenceEnabled(true);,我为什么需要keepSynced(true)

DatabaseReference r = FirebaseDatabase.getInstance().getReference("chat/roomid");
r.keepSynced(true);
Run Code Online (Sandbox Code Playgroud)

Fra*_*len 28

应用中的Firebase数据库客户端可以将数据从数据库保存在两个位置:内存和/或磁盘上.

  1. 附加侦听器时,它会将数据库中的数据同步到应用程序中的内存表示形式.
  2. 如果您已经启用持久性,数据会自动坚持在磁盘上.
  3. 从位置分离最后一个侦听器时,将从内存中刷新该位置的数据.但它不会从磁盘中删除.

当您保持位置同步时,客户端实际上会将空侦听器附加到该位置.因此,应用程序中的数据将始终与服务器上的数据库中的数据保持同步(只要存在网络连接).如果您尚未启用持久性,则数据将在内存中保持最新.如果您启用了持久性,它也将在磁盘上保持最新.

尽管将keepSynced与持久性一起使用是最常见的,但也存在没有持久性的用例.

例如,如果您有一个主 - 详细信息应用程序,您经常从项目名称列表中跳出到每个项目的详细信息.在这种情况下,保持项目名称列表同步将使您不必在用户从详细信息屏幕返回时重新加载该数据.

你当然也可以简单地在数据上保留一个监听器,这实际上就是keepSynced在幕后所做的事情.