2016-12-31 160 views
0

以下情况:未注册火力地堡setOffline()和脱机阅读资料(Android)

  1. 用户,我保存数据,同时离线(火力地堡setOffline())
  2. 无法读取本地数据(填充的ListView等) - 在ValueEventListenerChildEventListener不火
  3. 我在火力地堡例如设置setOnline()
  4. 数据是与网络同步并显示(侦听器触发)
  5. 我再次设置了setOffline()。
  6. 我保存本地数据和读取本地数据,工程(听众火)

问题:存储在上网之前

如何读取本地数据?

的情况是:用户使用的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()在线是之前工作

+0

对不起,我很难解析你的描述。您能否将代码重现为代码片段? –

+0

https://gist.github.com/ramden/3addea21cf925ecd3c8c380f78679ad9 – ramden

+0

感谢您的代码。我将它添加到问题中,因为链接倾向于腐烂。由于您在客户端有机会同步任何数据之前强制客户端在场景1中脱机,因此我确实希望它不会在该场景中触发'onDataChange()'。在第三个片段中,它*将会触发,因为它有机会将数据同步到本地缓存。 –

回答

1

既然你强制客户端在方案1脱机它有机会同步的任何数据之前,我的确希望它不在该场景中激发onDataChange()。在第三部分中,它会触发,因为它有机会将数据同步到本地缓存。

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

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

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