无法在Firestore中禁用脱机数据

从我的Firestore Database删除数据后,我的Android app一些时间才意识到数据已被删除,而且我认为这是由于自动数据caching引起的。 我的应用程序与离线使用无关,我想禁用此function…

我在我的自定义Application Class添加了这个:

 import android.app.Application; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.firestore.FirebaseFirestoreSettings; public class ApplicationClass extends Application { @Override public void onCreate() { super.onCreate(); FirebaseFirestore db=FirebaseFirestore.getInstance(); FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder() .setPersistenceEnabled(false) .build(); db.setFirestoreSettings(settings); } } 

这个问题发生在closures互联网连接之后,而不是重新打开( 当应用程序仍在运行时,在后台运行 ), Firestore module似乎失去了与服务器的连接,并且与预期相反一个 – 而不是停止从caching中获取数据,它只从caching中获取数据。

例如,debugging此代码将始终显示isFromCachetruedocumentSnapshot为空 (即使在server端 – 它不是空的):

 usersRef.document(loggedEmail).collection("challenges_received").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() { @Override public void onSuccess(QuerySnapshot documentSnapshots) { boolean isFromCache=documentSnapshots.getMetadata().isFromCache(); if (!documentSnapshots.isEmpty()) { } } }); 

这是正常的行为?

有没有另一种方法来禁用Cloud Firestore的数据caching?


编辑:

添加: FirebaseFirestore.setLoggingEnabled(flase); (而不是上面的代码)在自定义Application Class给出了相同的结果。

Solutions Collecting From Web of "无法在Firestore中禁用脱机数据"

我只是在Android应用程序中运行一些testing,看看它是如何工作的。 由于Firestore目前仍在beta release ,产品可能会随时发生变化,所以我不能保证这种行为在未来仍然有效。

 db.collection("tests").document("fOpCiqmUjAzjnZimjd5c").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { @Override public void onComplete(@NonNull Task<DocumentSnapshot> task) { DocumentSnapshot documentSnapshot = task.getResult(); System.out.println("isFromCache: " + documentSnapshot.getMetadata().isFromCache()); } }); 

关于代码,无论是从caching中获取数据还是连接到服务器,都是一样的。

当我在线时打印:

 isFromCache: false 

当我离线时,它会打印:

 isFromCache: true 

因此,暂时没有办法在没有连接到服务器时停止从caching中检索数据,因为在连接到服务器时不能强制从caching中检索数据。

如果我使用一个监听器:

 db.collection("tests").document("fOpCiqmUjAzjnZimjd5c").addSnapshotListener(new DocumentListenOptions().includeMetadataChanges(), new EventListener<DocumentSnapshot>() { @Override public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) { System.out.println("listener.isFromCache: " + documentSnapshot.getMetadata().isFromCache()); } }); 

当我在线时,我得到两个打印:

 listener.isFromCache: true listener.isFromCache: false 

当设备永久脱机或者应用程序暂时失去networking连接时,Firestore会自动从chache中检索数据,而目前您无法更改此行为。

简单地说,一个类似这样的API现在还不存在。

编辑:与Firebase不同的是,在哪里启用脱机持久性,您需要使用以下代码行:

 FirebaseDatabase.getInstance().setPersistenceEnabled(true); 

在Firestore中,对于Android和iOS, enabled by default脱机持久性。

使用上面的代码行,意味着您告诉Firebase创build数据库的本地(内部)副本,以便您的应用即使暂时失去其networking连接也可以工作。

在Firestore中,我们发现相反,为了禁用持久性,我们需要将PersistenceEnabled选项设置为false 。 这意味着您告知Firestore不要在用户设备上创build数据库的本地副本,这意味着除非您连接到Firebase服务器,否则将无法查询数据库。 因此,如果没有数据库的本地副本,并且如果被抛弃,则会抛出exception。 这就是为什么使用OnFailureListener一个好习惯。

 // Enable Firestore logging FirebaseFirestore.setLoggingEnabled(flase); // Firestore mFirestore = FirebaseFirestore.getInstance(); 

通常情况下,Firebase客户端会尽量减less下载数据的次数。 但是它也会尽量减less它使用的内存/磁盘空间。

确切的行为取决于很多事情,例如另一个侦听器是否在该位置保持活动状态以及是否使用磁盘持久性。 如果您有两个相同(或重叠)数据的侦听器,则只会下载一次更新。 但是,如果您删除某个位置的最后一个侦听器,则会从(内存和/或磁盘)caching中删除该位置的数据。

没有看到一个完整的代码,很难说出你的情况会发生什么。

或者:您可以通过启用Firebase的日志logging来检查自己[Firebase setLoggingEnabled:YES] ;

试试这个对于FireBase数据库

  mDatabase.getReference().keepSynced(false); FirebaseDatabase.getInstance().setPersistenceEnabled(false);