Firebase:setPersistenceEnabled和keepSynced有什么区别?

时间:2016-10-22 08:59:46

标签: android firebase firebase-realtime-database persistence

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

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

然后,根据DOCS:

  

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

如果setPersistenceEnabled(true);时数据已经可以离线使用,为什么我需要keepSynced(true)

DatabaseReference r = FirebaseDatabase.getInstance().getReference("chat/roomid");
r.keepSynced(true);

3 个答案:

答案 0 :(得分:24)

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

  1. 当您附加侦听器时,它会将数据库中的数据同步到应用程序中的内存表示形式。
  2. 如果您启用了持久性,则数据会自动保留在磁盘上。
  3. 从某个位置分离最后一个侦听器时,将从内存中刷新该位置的数据。但它不会从磁盘中删除。
  4. 当您保持位置同步时,客户端实际上会将空侦听器附加到该位置。因此,应用程序中的数据将始终与服务器上的数据库中的数据保持同步(只要存在网络连接)。如果您尚未启用持久性,则数据将在内存中保持最新。如果您启用了持久性,它也将在磁盘上保持最新。

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

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

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

答案 1 :(得分:2)

根据Firebase documentation

  

默认情况下,Firebase客户端会在应用程序运行时将数据保留在内存中,但在重新启动时则不会。通过将此值设置为true,数据将持久保存到设备上(磁盘)存储,并在应用重新启动时再次可用(即使存在当时没有网络连接)。请注意,必须在创建第一个Firebase引用之前调用此方法,并且每个应用程序只需调用一次。如果您的应用使用Firebase身份验证,即使未启用持久性,客户端也会在重新启动时自动保留用户的身份验证令牌。但是,如果auth令牌在脱机时过期并且您已启用持久性,则客户端将暂停写入操作,直到您成功重新进行身份验证(或显式调用unauth)以防止您的写入未经身份验证并因安全规则而失败。

请注意,它表示数据将保留在磁盘上,并在应用重新启动时可用。如果您查看life cycle of an Activity,则会在您更改为其他活动时看到活动停止。因此,只要您的应用仍处于打开状态且用户仅导航到其他活动,数据将保持不变。

但是不要说杀死你的应用并保留数据。这就是您需要keepSynced()

的原因
  

通过在某个位置调用keepSynced(true),该位置的数据将自动下载并保持同步,即使没有为该位置连接侦听器也是如此。此外,当一个位置保持同步时,它不会被永久磁盘缓存驱逐

当它说“#34”时请注意,当位置保持同步时,它不会从持久性磁盘缓存中被驱逐",这意味着如果您不使用keepSynced(true)您的数据当应用程序被杀死/关闭时,可以刷新。

因此,要在应用被杀后继续保留并继续使用数据,您需要同时使用FirebaseDatabase.getInstance().setPersistenceEnabled(true);keepSynced(true)

答案 2 :(得分:2)

setPersistanceEnabled(true)它会存储数据以供离线使用。

keepsynced(true)默认情况下,Firebase会将10mb数据保留在缓存中,如果它进一步增长,它将替换为新数据。为避免相同而保持整个数据保持不变(true)将有助于你。