Firebase数据库停止同步

时间:2018-04-10 16:12:25

标签: android firebase firebase-realtime-database

我在我的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

}

这可能是什么原因?

3 个答案:

答案 0 :(得分:2)

据我所知,这只有三个原因。

1)方法getUID()

不知何故getUID()方法返回一个空值或无效值,导致数据存储到其他地方,或者根本没有存储。

您只使用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")))非常聪明。我将采纳它。

答案 1 :(得分:0)

好吧,如果您的数据库已经同步并且您没有对代码进行任何更改,则意味着这是一个firebase错误,尤其与用户使用的移动电话有关。

使用firebase的大多数开发人员在使用某些运营商时会发现查询数据库的问题。我已经研究过这个问题,但我还没有解决它。如果您碰巧使用移动数据,则对用户进行身份验证等操作可能无效。

解决方案

使用其他互联网来源测试您的代码。在调试或测试应用程序时尝试使用wifi而不是移动数据。

如果我发现任何有用的工作,我会将其存档在遇到开源Lucem

问题的firebase项目中

答案 2 :(得分:0)

将此视为猜测: 在某些时候,您分发了一个BuildConfig.DEBUG = true的应用程序,因此安装更新版本的用户“丢失”了他们的数据。没有解释为什么其他用户没有报告更短的损失...

解决方案是数据迁移,检查哪些数据具有较新的数据,然后在DEBUG较新时复制数据。