我是第一次使用firebase,阅读有关firebase的离线功能,测试了两种情况:
方案1(正常工作):
离线模式,将数据写入firebase数据库。
按后退按钮(关闭应用程序)
方案2(不工作):
我添加了这一行:
Firebase.getDefaultConfig().setPersistenceEnabled(true);
如何处理方案2?我是否需要通过本地数据库处理这种情况?
答案 0 :(得分:0)
我猜你使用一些服务来同步数据,它不适用于第二种情况。为此,当用户打开数据服务时,您将收到一个广播接收器,该检查服务未运行,然后启动该服务。
答案 1 :(得分:0)
您使用的是Firebase.getDefaultConfig().setPersistenceEnabled(true);
和keepSynced(true)
吗?
因为在Firebase documentation中说keepSynced(true)
发生了“神奇”的事情(与setPersistenceEnabled(true)
一起发生):
通过在某个位置调用keepSynced(true),该位置的数据将自动下载并保持同步,即使没有为该位置连接侦听器也是如此。此外,当一个位置保持同步时,它不会被永久磁盘缓存驱逐。
因此,如果您没有使用它,那么您不是在本地持久保存数据库,然后当您“杀死”应用程序时,将无法从您的应用程序再次打开时查询任何数据库。
答案 2 :(得分:0)
无需使用本地数据库处理方案2。在应用程序类中使用Firebase.getDefaultConfig()。setPersistenceEnabled(true)并使android:name =" yourapplicationclass"在清单文件中。 在更改网络时处理同步,即在线/离线使用事务处理程序来处理本地同步到firebase数据库,因为一些tome数据没有被推送到firebase服务器。就像我在网络中使用改变方法并解决了这个问题:
mDatabase.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
if(mutableData.getValue() == null) {
mutableData.setValue(1);
} else {
mutableData.setValue((Long) mutableData.getValue() + 1);
}
return Transaction.success(mutableData); //we can also abort by calling Transaction.abort()
}
@Override
public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
}
});