【问题标题】:How does Firestore persistence really work?Firestore 持久性如何真正发挥作用?
【发布时间】:2019-04-09 10:36:47
【问题描述】:

我在documentation看到这个:

要使用离线持久性,您无需对 用于访问 Cloud Firestore 数据的代码。有离线 启用持久性,Cloud Firestore 客户端库自动 管理在线和离线数据访问并同步本地数据 当设备重新联机时。

...

对于 Android 和 iOS,默认情况下会启用离线持久性。到 禁用持久性,将PersistenceEnabled 选项设置为false

在 Android 中,我创建我的 Firestore 引用如下:

final FirebaseFirestore db = FirebaseFirestore.getInstance();

然后,我假设默认情况下启用持久性。

我将尝试用这张图片解释发生了什么:

A

  • 我昨天添加了这个文档,并且在设备连接的情况下正常阅读。

  • 今天我可以使用设备离线阅读此文档。

B

  • 昨天我也添加了这个文件。 设备在此文档存在后在线,但我没有阅读此文档。已添加但从未阅读。
  • 今天,设备离线我尝试阅读此文档,但不可行。 (为什么设备在线时没有同步?)

C

昨天我访问了集合6,文档03000503...

没有为整个集合启用持久化?

当我添加文档03030501时,该文档在线时不与设备同步?如果我不阅读文档在线一次,不同步?在这种情况下,不是collection 6中的所有文档都同步?

如果我将一个文档添加到集合 6,我需要设备在该文档在线时同步该文档,而无需输入该新文档。这可能吗?


这是读取文档的代码:

public void launchFirestore() {
    final FirebaseFirestore db = FirebaseFirestore.getInstance();
    String fechaDD = strFechaHoy.substring(6, 8);
    String fechaMM = strFechaHoy.substring(4, 6);
    String fechaYYYY = strFechaHoy.substring(0, 4);

    DocumentReference calRef = db.collection(CALENDAR_PATH).document(fechaYYYY).collection(fechaMM).document(fechaDD);
    calRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
        @Override
        public void onEvent(@Nullable DocumentSnapshot calSnapshot,
                            @Nullable FirebaseFirestoreException e) {
            DocumentReference dataRef=calSnapshot.getDocumentReference(VISPERAS_ID);
            if (e != null || dataRef==null) {
                launchVolley();
                return;
            }

            if (calSnapshot != null && calSnapshot.exists()) {
                dataRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                    @Override
                    public void onSuccess(DocumentSnapshot dataSnapshot) {
                        //Log.d(TAG,"---"+dataSnapshot.toString());
                        mBreviario = dataSnapshot.toObject(Breviario.class);
                        showData();
                    }
                });
            } else {
                launchVolley();
            }
        }
    });
}

【问题讨论】:

    标签: android firebase synchronization google-cloud-firestore


    【解决方案1】:

    Firebase不会自动缓存设备上数据库中的所有数据。它的磁盘持久性仅将客户端已经请求的数据存储在其本地数据库中。

    来自您链接的同一文档页面:

    此功能会缓存一份您的应用正在使用的 Cloud Firestore 数据副​​本,以便您的应用可以在设备离线时访问数据。

    如果您考虑一下,这是有道理的:如果 Firebase 会同步您的用户可能看到的所有数据,那么它可能必须同步整个数据库。这在移动设备上是不合理的。

    如果您希望特定数据可离线使用,请确保在设备仍在线时将观察附加到该数据。

    【讨论】:

    • 感谢您的回复,现在更清晰了。正如您所说,如果您希望特定数据可以离线使用,请确保在设备仍在线时将观察附加到该数据。这只是我需要将所有内容放入我的lh收藏。我怎么能这样做?不会很贵吧?
    • 如果您想要一个完全离线复制的数据库,您可能确实需要考虑其他选项。
    • 是的,未来的想法是在应用程序中创建一个 SQLite 数据库,但暂时我需要一种简单的方法来离线提供这部分数据,然后我想在 Firebase 中。这不是我的全部数据库,而是集合中的内容 lh 仅。
    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 2012-07-17
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    相关资源
    最近更新 更多