Firebase setOffline()和读取离线数据(android)

时间:2016-12-31 19:55:59

标签: android firebase firebase-realtime-database

以下情况:

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

    如何在上网前阅读存储的本地数据?

    场景是:用户离线使用Android应用程序并稍后决定注册

    情景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()

    联机之前不起作用

1 个答案:

答案 0 :(得分:1)

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

但是你为什么要明确地尝试管理在线/离线状态?通过这样做,你正在挖一个洞,你可能会发现它很难摆脱。

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

请记住,离线启动并且仅启用后续同步并不是使用Firebase数据库的理想方式,Firebase数据库主要是一个继续脱机工作的在线数据库。