当我的用户在我的Android应用中离线时调用setValue时,Firebase会提供本地商店对我的侦听器所做更改的快照,即使更改尚未提交给服务器。我了解Firebase将在恢复连接时努力与服务器同步,但如果应用重新启动,则该更改将永久丢失。
我已经为我的所有数据准备了一个自定义本地存储,我希望自己可以跟踪未提交的更改,当我从成功的setValue服务器收到回复时清除脏位。但如果本地商店假装提交日期,那似乎不可能。
我认为我不想使用磁盘持久性(因为我已经拥有自己的磁盘持久性)。有没有办法告诉更新何时来自本地存储与真实服务器提交?或者我应该使用完成监听器来清除脏位?
答案 0 :(得分:2)
我了解Firebase将在恢复连接时努力与服务器同步,但如果应用重新启动,则该更改将永久丢失。
默认行为确实是挂起的写入保留在内存中。但是,您可以通过enabling disk persistence轻松更改它。
Firebase.getDefaultConfig().setPersistenceEnabled(true);
但是,既然您表示不想使用它,那么另一种方法是使用CompletionListener来检测Firebase服务器上的更改何时提交:
ref.setValue("I'm writing data", new Firebase.CompletionListener() {
@Override
public void onComplete(FirebaseError firebaseError, Firebase firebase) {
if (firebaseError != null) {
System.out.println("Data could not be saved. " + firebaseError.getMessage());
} else {
System.out.println("Data saved successfully.");
}
}
});
请注意,完成侦听器不会持久保存到磁盘。因此,即使您启用了持久性,在应用程序重新启动后执行挂起写入时,完成回调将不触发。因此,请勿尝试混合磁盘持久性或完成侦听器。