我已经在我的Android应用程序中使用Firebase数据库将近一年了,它工作得很好。不幸的是,数据在一段时间后停止同步到data。它只是从来没有同步/存储到云中。只有本地的。因此,当用户重新安装应用程序时,它只包含存储在云中的数据。因此,对于用户来说,数据看起来像是被删除了,但实际上从来没有存储过。我检查了一下,在firebase-console中看不到数据。因为它发生在重新安装之后,我猜这与同步有关。用户报告大约2-3个月的数据丢失。
我正在使用下面的单例助手类。注意:我使用setPersistenceEnabled(true)和keepSynced(true)。
public class FirebaseHelper{
protected FirebaseHelper(Context c) {
this.c = c.getApplicationContext();
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
mAuth = FirebaseAuth.getInstance();
this.userRef = FirebaseDatabase.getInstance().getReference().child(((BuildConfig.DEBUG ? "debug" : "release"))).child("users").child(getUID());
this.userRef.keepSynced(true);
this.path1 = userRef.child("path1");
this.path2 = userRef.child("path2");
this.path3 = userRef.child("path3");
this.path4 = userRef.child("path4");
}
public static FirebaseHelper getInstance(Context c) {
if (instance == null) {
instance = new FirebaseHelper(c);
}
return instance;
}
public String insertObject(MyObject obj) {
DatabaseReference newItem = this.path1.push();
String pushID = newItem.getKey();
obj.id = pushID;
newItem.setValue(obj.getObject());
return pushID;
}
public void updateData(...){}
...other methods
}这可能是什么原因呢?
发布于 2018-04-19 14:12:29
据我所知,发生这种情况只有三个原因。
1)方法getUID()
不知何故,getUID()方法返回一个null或无效值,导致数据被存储到其他地方,或者根本不被存储。
您正在简单地使用getUid()而不是FirebaseAuth.getInstance().getCurrentUser().getUid()。因此它必须是用户定义的方法。
我认为您的getUid()可以做这样的事情。
String getUid() {
try{
return FirebaseAuth.getInstance().getCurrentUser().getUid() ;
} catch (NullPointerException e) {
return null;
}
}如果清除缓存,FirebaseAuth.getInstance().getCurrentUser()将返回null。它会导致你的数据丢失。
2)冗余数据
自Marshmallow以来,数据被备份到云中,包括共享首选项。如果您正在检查共享首选项以确定用户是否已登录,则用户将在重新安装应用程序后被带到内部,跳过登录页面。但实际上他没有登录,这意味着FirebaseAuth.getInstance().getCurrentUser()返回null,任何访问数据库的尝试都将失败(这取决于您的数据库规则)。
解决方案:使用FirebaseAuth.getInstance().getCurrentUser()==null检查用户是否已启用。您也可以选择set backup to false。但我更喜欢第一种方法。
3) Firebase SDK中的内部错误
不幸的是,我们对此无能为力。尝试缩小范围,找到一个可以重现该问题的方案,并将其报告给Firebase。
顺便说一句,child(((BuildConfig.DEBUG ? "debug" : "release")))真的很聪明。我打算采用它。
发布于 2018-04-19 20:07:12
好吧,如果你的数据库一直在同步,并且你没有对代码做任何更改,这意味着这是一个firebase错误,特别是与用户使用的手机相关的错误。
当使用某些运营商时,大多数使用firebase的开发人员在查询数据库时会发现问题。我已经研究了这个问题,但我还没有解决它。如果您碰巧使用的是移动数据,则验证用户等操作可能不起作用。
解决方案
使用不同的internet源来测试代码。在调试或测试应用程序时,尝试使用wifi而不是移动数据。
如果我找到了任何有用的解决方法,我会将其归档到在开源Lucem上遇到问题的firebase项目中
发布于 2018-04-20 09:21:56
这也是一种猜测:在某个时候,您分发了一个BuildConfig.DEBUG = true的应用程序,因此安装更新版本的用户“丢失”了他们的数据。不能解释为什么其他用户没有报告较短的损失...
解决方案是数据迁移,检查哪个数据较新,如果DEBUG较新,则复制数据。
https://stackoverflow.com/questions/49758375
复制相似问题