我在我的Android应用程序中使用Firebase数据库已有近一年的时间了,它的工作非常好。不幸的是,一段时间后数据停止同步。它永远不会同步/存储到云端。只有当地人。因此,当用户重新安装应用程序时,它只包含存储在云中的数据。所以对用户而言,数据似乎已被删除,但实际上从未存储过。我检查了,并且在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
}
这可能是什么原因?
答案 0 :(得分:2)
据我所知,这只有三个原因。
不知何故getUID()
方法返回一个空值或无效值,导致数据存储到其他地方,或者根本没有存储。
您只使用getUid()
代替FirebaseAuth.getInstance().getCurrentUser().getUid()
。所以它必须是用户定义的方法。
我认为你的getUid()会做这样的事情。
String getUid() {
try{
return FirebaseAuth.getInstance().getCurrentUser().getUid() ;
} catch (NullPointerException e) {
return null;
}
}
如果清除缓存, FirebaseAuth.getInstance().getCurrentUser()
将返回null。它会导致您的数据丢失。
自Marshmallow以来,数据已备份到云端,包括共享首选项。如果您正在检查共享首选项以确定用户是否已登录,则在重新安装应用程序后跳过登录页面的用户将被取消。但实际上他没有登录,这意味着FirebaseAuth.getInstance().getCurrentUser()
返回null,任何访问数据库的尝试都将失败(取决于您的数据库规则)。
解决方案:使用FirebaseAuth.getInstance().getCurrentUser()==null
检查用户是否已启用。
您也可以set backup to false。但我更喜欢第一种方法。
不幸的是,我们无能为力。尝试缩小范围并找到可以复制问题的方案并将其报告给Firebase。
顺便说一句,child(((BuildConfig.DEBUG ? "debug" : "release")))
非常聪明。我将采纳它。
答案 1 :(得分:0)
好吧,如果您的数据库已经同步并且您没有对代码进行任何更改,则意味着这是一个firebase错误,尤其与用户使用的移动电话有关。
使用firebase的大多数开发人员在使用某些运营商时会发现查询数据库的问题。我已经研究过这个问题,但我还没有解决它。如果您碰巧使用移动数据,则对用户进行身份验证等操作可能无效。
解决方案
使用其他互联网来源测试您的代码。在调试或测试应用程序时尝试使用wifi而不是移动数据。
如果我发现任何有用的工作,我会将其存档在遇到开源Lucem
问题的firebase项目中答案 2 :(得分:0)
将此视为猜测: 在某些时候,您分发了一个BuildConfig.DEBUG = true的应用程序,因此安装更新版本的用户“丢失”了他们的数据。没有解释为什么其他用户没有报告更短的损失...
解决方案是数据迁移,检查哪些数据具有较新的数据,然后在DEBUG较新时复制数据。