我使用持久性,orderByChild()和limitToLast方法在Firebase上有一个奇怪的行为。
这是我的基本代码。请注意,我的应用程序始终在线。 (您将在下面找到重现问题的所有步骤和示例项目的github链接)
在我的Application类中启用持久性:
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
为用户添加分数:
FirebaseDatabase.getInstance().getReference("scores")
.child("users")
.child("user1") //add a new user
.child("score") //along with a new score
.setValue(1);
获得最佳3分:
FirebaseDatabase.getInstance().getReference("scores")
.child("users")
.orderByChild("score")
.limitToLast(3)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
以下是重现问题的工作流程:
删除应用
再次安装应用
因此在这个特定用例中,主要问题是使用orderByChild和limitToLast方法的“获得最佳3分”请求在添加一些新分数后不会更新。 (但它在第7步中有效!)
我已经在我的github上传了Android项目:https://github.com/MalikDE/FirebaseOrderByChildIssue
答案 0 :(得分:0)
firebaser here
如果您附加了ChildEventListener
,将立即为新分数单独onChildAdded
。
行为说明:
Firebase数据库的一个保证是它永远不会触发包含不完整数据的事件。不幸的是,作为无模式数据库,Firebase有时并不清楚数据是否完整。
当您使用ValueEventListener
时,Firebase只会在知道该位置的完整数据后触发该事件。由于它没有意识到新分数是一个完整的新孩子,因此它并没有发布具有该分数的事件。
我们希望能够更好地检测到这一点,但我们不太可能在当前API中执行此操作而不会破坏向后兼容性。