【发布时间】:2016-12-31 19:55:58
【问题描述】:
以下情况:
- 用户未注册,我在离线时保存数据 (Firebase setOffline())
- 无法读取本地数据(填充列表视图等) - ValueEventListener 和 ChildEventListener 不要触发
- 我在 Firebase 实例上设置了 setOnline()
- 数据与网络同步并显示(监听器触发)
- 我再次设置了 setOffline()。
- 我保存本地数据并读取本地数据,工作(听众火)
问题:
上线前如何读取本地存储的数据?
场景是:用户离线使用安卓应用,后来决定注册
场景 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() 在线之前不起作用
【问题讨论】:
-
抱歉,我很难解析您的描述。您能否将重现问题的代码显示为 sn-p?
-
感谢您的代码。我将它添加到问题中,因为链接往往会腐烂。由于您在场景 1 中强制客户端在有机会同步任何数据之前下线,因此我确实希望它不会在该场景中触发
onDataChange()。在第三个片段中,它将触发,因为它有机会将数据同步到本地缓存。 -
感谢您改进问题。那么答案是让它先同步(空)然后下线吗?这可能很难实现,因为我必须确保它至少同步了一次。对吗?
-
如果您不想让用户登录,您可以从匿名身份验证开始,然后将其升级为电子邮件/密码或社交帐户。但是从离线开始并稍后才启用同步并不是使用 Firebase 数据库的理想方式,Firebase 数据库主要是一个继续离线工作的在线数据库。
标签: android firebase firebase-realtime-database