以下情况:
问题:
如何在上网前阅读存储的本地数据?
场景是:用户离线使用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个段(代码块)。
问题是第一个块在使用setOnline()
联机之前不起作用答案 0 :(得分:1)
由于在有机会同步任何数据之前强制客户端在方案1中脱机,我确实希望它不会在该方案中触发onDataChange()
。在第3个片段中,它将触发,因为它有机会将数据同步到本地缓存。
但是你为什么要明确地尝试管理在线/离线状态?通过这样做,你正在挖一个洞,你可能会发现它很难摆脱。
如果您想避免让用户登录,可以先使用匿名身份验证,然后再将其升级为电子邮件/密码或社交帐户。
请记住,离线启动并且仅启用后续同步并不是使用Firebase数据库的理想方式,Firebase数据库主要是一个继续脱机工作的在线数据库。