Android:使用持久性与orderByChild()和limitToLast()的Firebase上的Bug?

时间:2017-06-20 15:04:25

标签: android firebase firebase-realtime-database persistence

我使用持久性,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) {

                        }
                    });

以下是重现问题的工作流程:

  1. 清除您的firebase数据库
  2. 显示所有数据库以确认所有内容都为空
  3. 显示最佳3个分数以确认一切都是空的
  4. 添加新分数:(user1,1)
  5. 显示最佳3个分数。结果=(user1,1)=>行
  6. 添加新分数:(user2,2)
  7. 显示最佳3个分数。结果=(user1,1),(user2,2)=>行
  8. 删除应用

    再次安装应用

    1. 显示最佳3个分数。结果=(user1,1),(user2,2)=>行
    2. 添加2个新分数:(user3,3)和(user4,4)
    3. 显示最佳3个分数。结果=(user1,1),(user2,2)=> NOK
    4. 显示所有DB => (user1,1),(user2,2),(user3,3),(user4,4)=>行
    5. 因此在这个特定用例中,主要问题是使用orderByChild和limitToLast方法的“获得最佳3分”请求在添加一些新分数后不会更新。 (但它在第7步中有效!)

      我已经在我的github上传了Android项目:https://github.com/MalikDE/FirebaseOrderByChildIssue

1 个答案:

答案 0 :(得分:0)

firebaser here

如果您附加了ChildEventListener立即为新分数单独onChildAdded

行为说明:

Firebase数据库的一个保证是它永远不会触发包含不完整数据的事件。不幸的是,作为无模式数据库,Firebase有时并不清楚数据是否完整。

当您使用ValueEventListener时,Firebase只会在知道该位置的完整数据后触发该事件。由于它没有意识到新分数是一个完整的新孩子,因此它并没有发布具有该分数的事件。

我们希望能够更好地检测到这一点,但我们不太可能在当前API中执行此操作而不会破坏向后兼容性。