【问题标题】:Firebase setOffline() and reading offline data (android)Firebase setOffline() 和读取离线数据 (android)
【发布时间】:2016-12-31 19:55:58
【问题描述】:

以下情况:

  1. 用户未注册,我在离线时保存数据 (Firebase setOffline())
  2. 无法读取本地数据(填充列表视图等) - ValueEventListenerChildEventListener 不要触发
  3. 我在 Firebase 实例上设置了 setOnline()
  4. 数据与网络同步并显示(监听器触发)
  5. 我再次设置了 setOffline()。
  6. 我保存本地数据并读取本地数据,工作(听众火)

问题:

上线前如何读取本地存储的数据?

场景是:用户离线使用安卓应用,后来决定注册

场景 1:

FirebaseDatabase.getInstance().setPersistenceEnabled(true);
FirebaseDatabase.getInstance().goOffline();  // <--------NOTE THIS

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("users").child(App.get().getUid()).child("items").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // THIS IS NOT FIRING
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        ...
    }
});

在场景 1 之后,我将代码更改为此并运行:

FirebaseDatabase.getInstance().setPersistenceEnabled(true);
FirebaseDatabase.getInstance().goOnline();  // <--------NOTE THIS

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("users").child(App.get().getUid()).child("items").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // THIS IS FIRING. ALL GOOD
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        ...
    }
});

在此之后我将代码更改为以下代码并且它可以工作

FirebaseDatabase.getInstance().setPersistenceEnabled(true);
FirebaseDatabase.getInstance().goOffline(); // <--------NOTE THIS

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("users").child(App.get().getUid()).child("items").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // THIS IS FIRING. ALL GOOD
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        ...
    }
});

我添加了 3 个段(代码块)。

  • 我执行第一个块 - 不起作用
  • 第二块 - 工作
  • 第三块 - 工作

这是gist with the code

问题是第一个块在使用 setOnline() 在线之前不起作用

【问题讨论】:

  • 抱歉,我很难解析您的描述。您能否将重现问题的代码显示为 sn-p?
  • 感谢您的代码。我将它添加到问题中,因为链接往往会腐烂。由于您在场景 1 中强制客户端在有机会同步任何数据之前下线,因此我确实希望它不会在该场景中触发 onDataChange()。在第三个片段中,它触发,因为它有机会将数据同步到本地缓存。
  • 感谢您改进问题。那么答案是让它先同步(空)然后下线吗?这可能很难实现,因为我必须确保它至少同步了一次。对吗?
  • 如果您不想让用户登录,您可以从匿名身份验证开始,然后将其升级为电子邮件/密码或社交帐户。但是从离线开始并稍后才启用同步并不是使用 Firebase 数据库的理想方式,Firebase 数据库主要是一个继续离线工作的在线数据库。

标签: android firebase firebase-realtime-database


【解决方案1】:

由于您在场景 1 中强制客户端在有机会同步任何数据之前下线,因此我确实希望它不会在该场景中触发 onDataChange()。在第三个片段中它会触发,因为它有机会将数据同步到本地缓存。

但是您为什么要明确尝试管理在线/离线状态?这样做是在挖一个你可能很难摆脱的洞。

如果您不想让用户登录,您可以从匿名身份验证开始,然后将其升级为电子邮件/密码或社交帐户。

请记住,离线开始并稍后才启用同步并不是使用 Firebase 数据库的理想方式,Firebase 数据库主要是一个继续离线工作的在线数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-31
    • 2018-06-23
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多