【问题标题】:Firestore offline cacheFirestore 离线缓存
【发布时间】:2018-03-28 00:50:01
【问题描述】:

我正在构建一个 Android 应用程序,它必须离线工作数周,但可以在它上线时立即与远程数据库同步。

我的问题是 Firestore 可以成为一个不错的选择吗? Firestore 会将其离线缓存保留多长时间?

【问题讨论】:

  • 看来如果你需要将大量数据保存到离线缓存,你需要与SQLite或其他本地数据库或缓存系统同步数据。
  • 您好,请问您是如何在 Firestore 中离线插入数据的
  • firestore 在离线写入数据时的行为真的很混乱而且不清楚......完成块永远不会返回......
  • Balazs,您最终是否使用 Firestore 作为可以持续数周的离线数据库?只是想知道您是否选择了其他东西?

标签: android firebase google-cloud-firestore


【解决方案1】:

Firestore 可以配置为持久保存数据以供此类断开/离线使用。我建议您阅读文档中的enable offline persistence 部分,其中包含启用此功能的示例:

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(true)
        .build();
db.setFirestoreSettings(settings);

这个持久化其实Android和iOS都是默认开启的,所以不需要上面的调用。

无论您是否已连接,与数据库交互的 Android 代码都是相同的,因为 SDK 的工作原理相同。如果您想检测数据是否来自缓存(因此可能是陈旧的),请阅读文档中的 Listen to offline data 部分。

缓存中的数据在一定时间后不会过期。从缓存中删除数据的唯一两个原因:

  1. 数据已从服务器中删除,在这种情况下,客户端会将其从磁盘缓存中删除。
  2. 客户端需要清除其磁盘缓存,以便为更新的数据腾出空间。

【讨论】:

  • 对不起,如果我不够清楚,但我的问题是 Firestore 将其离线缓存保留多长时间?我已经阅读了您之前发送的链接,其中包含以下内容:“此功能缓存您的应用正在使用的 Cloud Firestore 数据的副本,因此您的应用可以在设备离线时访问数据。” “积极使用”究竟是什么意思?如果我在一天或一周后不访问它,它会删除我的数据吗?我可以将其配置为保留我的所有数据,直到我拒绝?
  • 没有明确的缓存过期。它会保留数据,直到需要为新数据腾出空间。
  • 所以如果它决定它需要空间,那么它会删除我的数据吗?在开始删除我的数据之前,它可以存储多少数据?这对我很重要,因为我需要一个可靠的本地数据库。
  • 此时不能保证启用持久性。这是一个缓存,而不是保证的离线商店。我们希望最终在 API 中添加一种“固定”功能,让您获得这种保证,但现在您应该期望缓存是可用且有用的,但不能保证。
  • 答案中的代码是多余的,因为默认启用了缓存。
【解决方案2】:

EDIT-25/5/2020:Francesco 是正确的,评论中给出的文档链接确实澄清了这一点。似乎缓存大小已更改,默认已减小到 40MB。

OLD:以下答案遵循以下链接中的官方指南:

Handling Cache size

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
    .setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED)
    .build();
db.setFirestoreSettings(settings);

上面的代码为 setCacheSize() 设置了一个标志,这将阻止你的缓存 被清除。您也可以指定相同的大小。如果您不设置,默认大小为 100MB。

根据指南,有一种方法可以检查您查询的数据是来自缓存还是来自 Firestore。此外,当您的设备重新联机时,Firestore 会刷新缓存并保持数据同步。

要回答您的问题,由于您必须使用数周的离线数据,我建议每次提取数据以将其存储为 json/xml 格式,因为在缓存中存储大量数据并不是一个很好的方法当考虑到性能时。

希望我能帮助你解决一些问题。

【讨论】:

【解决方案3】:

如果您在 Cloud Firestore 中收听数据,您将立即获得缓存数据的快照,并在您的应用能够在线连接时进行更新:

final DocumentReference docRef = db.collection("cities").document("SF");
docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(@Nullable DocumentSnapshot snapshot,
                        @Nullable FirebaseFirestoreException e) {
        if (e != null) {
            Log.w(TAG, "Listen failed.", e);
            return;
        }


        // Determine if the data came from the server or from cache
        String source = snapshot != null && snapshot.getMetadata().hasPendingWrites()
                ? "Local" : "Server";


        // Read the data
        if (snapshot != null && snapshot.exists()) {
            Log.d(TAG, source + " data: " + snapshot.getData());
        } else {
            Log.d(TAG, source + " data: null");
        }
    }
});

默认情况下启用持久性,因此此行为不需要任何配置。

【讨论】:

    猜你喜欢
    • 2018-07-26
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2018-08-06
    相关资源
    最近更新 更多