首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Firebase数据库停止同步

Firebase数据库停止同步
EN

Stack Overflow用户
提问于 2018-04-11 00:12:25
回答 3查看 403关注 0票数 0

我已经在我的Android应用程序中使用Firebase数据库将近一年了,它工作得很好。不幸的是,数据在一段时间后停止同步到data。它只是从来没有同步/存储到云中。只有本地的。因此,当用户重新安装应用程序时,它只包含存储在云中的数据。因此,对于用户来说,数据看起来像是被删除了,但实际上从来没有存储过。我检查了一下,在firebase-console中看不到数据。因为它发生在重新安装之后,我猜这与同步有关。用户报告大约2-3个月的数据丢失。

我正在使用下面的单例助手类。注意:我使用setPersistenceEnabled(true)keepSynced(true)

代码语言:javascript
复制
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

}

这可能是什么原因呢?

EN

回答 3

Stack Overflow用户

发布于 2018-04-19 14:12:29

据我所知,发生这种情况只有三个原因。

1)方法getUID()

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

您正在简单地使用getUid()而不是FirebaseAuth.getInstance().getCurrentUser().getUid()。因此它必须是用户定义的方法。

我认为您的getUid()可以做这样的事情。

代码语言:javascript
复制
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")))真的很聪明。我打算采用它。

票数 2
EN

Stack Overflow用户

发布于 2018-04-19 20:07:12

好吧,如果你的数据库一直在同步,并且你没有对代码做任何更改,这意味着这是一个firebase错误,特别是与用户使用的手机相关的错误。

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

解决方案

使用不同的internet源来测试代码。在调试或测试应用程序时,尝试使用wifi而不是移动数据。

如果我找到了任何有用的解决方法,我会将其归档到在开源Lucem上遇到问题的firebase项目中

票数 0
EN

Stack Overflow用户

发布于 2018-04-20 09:21:56

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

解决方案是数据迁移,检查哪个数据较新,如果DEBUG较新,则复制数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49758375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档