我一直在想,当我使用以下所有数据聊天时,聊天会话将在任何时候离线。但实际上并非如此,所有节点都是从服务器加载的。
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
然后,根据文件:
持久性行为:通过启用持久性,我们在联机时同步的任何数据都将被持久化到磁盘,并可脱机使用,即使我们重新启动应用程序。这意味着我们的应用程序将使用缓存中存储的本地数据进行在线工作。
如果当
setPersistenceEnabled(true);
时数据已经可以脱机使用,为什么我需要keepSynced(true)
?DatabaseReference r = FirebaseDatabase.getInstance().getReference("chat/roomid");
r.keepSynced(true);
最佳答案
应用程序中的FireBase数据库客户端可以将数据库中的数据保存在两个位置:内存和/或磁盘上。
当您附加一个监听器时,它会将数据从数据库同步到应用程序中的内存表示形式。
如果启用了持久性,数据也会自动持久化到磁盘上。
从某个位置分离最后一个侦听器时,该位置的数据将从内存中刷新。但它并没有从磁盘上删除。
当您保持位置同步时,客户机基本上会将一个空的侦听器附加到该位置。因此,应用程序中的数据将始终与服务器上数据库中的数据保持最新(只要有网络连接)。如果您没有启用持久性,那么数据将在内存中保持最新。如果您启用了持久性,它也将在磁盘上保持最新。
虽然使用keepsynced和persistence是最常见的,但是也有一些没有persistence的用例。
例如,如果您有一个主细节应用程序,您经常从项目名称列表跳到每个项目的细节。在这种情况下,保持项目名称列表同步将避免在用户从详细信息屏幕返回时重新加载该数据。
当然,您也可以简单地让一个监听器保存数据,这基本上就是keepsynced在幕后所做的。