Firestore持久性如何真正发挥作用?

时间:2019-04-09 10:36:48

标签: android firebase synchronization google-cloud-firestore

我在documentation中读过这篇文章:

  

要使用离线持久性,您无需对   您用于访问Cloud Firestore数据的代码。离线   启用持久性后,Cloud Firestore客户端库会自动   管理在线和离线数据访问并同步本地数据   设备恢复在线状态。

     

...

     

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

在Android中,我按如下方式创建我的Firestore参考:

final FirebaseFirestore db = FirebaseFirestore.getInstance();

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

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

enter image description here

A

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

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

B

  • 昨天我也添加了此文档。该文档存在后,设备已联机,但我没有阅读该文档。它已添加,但从未阅读过。
  • 今天,设备离线,我尝试阅读此文档,但无法阅读。 (为什么设备在线期间未同步?)

C

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

未为整个集合启用持久性吗?

当我添加文档03030501时,此文档在线时是否与设备不同步?如果我一次在线不阅读文档,是否没有同步?在这种情况下,同步不是针对集合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();
            }
        }
    });
}

1 个答案:

答案 0 :(得分:1)

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

在您链接的同一文档页面上:

  

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

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

如果您希望离线获取特定数据,请确保在设备仍处于在线状态时将观察值附加到该数据上。