正确地将节点从最新到最旧排序

Rod*_*ers 7 sorting android firebase firebase-realtime-database

我正在使用a FirebaseRecyclerAdapterRecyclerView扩充Firebase实时数据库提供的数据.

我开始按他们的孩子对节点进行排序,该子节点date被设置为值ServerValue.TIMESTAMP.我向indexOn要使用dateFirebase数据库规则值排序的节点的父节点添加了一个属性.

"parent-node": {
  ".read": "auth != null",
  ".write": "auth != null",
  ".indexOn" : "date",
  ...
}, 
Run Code Online (Sandbox Code Playgroud)

这工作正常,但更新的节点添加到我的结尾RecyclerView.作为FirebaseRecyclerAdapter和它的FirebaseArray添加节点ChildEventListener,它意味着数据从最旧到最新排序.

我设法通过使用负值来反转这个ServerValue.TIMESTAMP.

private void prepareUpload() {
    //mDatabase is a reference to the root of the Firebase Database
    final DatabaseReference timestampReference = mDatabase.child("timestamp");
    final String timestampKey = timestampReference.push().getKey();
    timestampReference.child(timestampKey).setValue(ServerValue.TIMESTAMP);
    timestampReference.child(timestampKey).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.getValue() != null) {
                if (!(Long.parseLong(dataSnapshot.getValue().toString()) < 0)) {
                    timestampReference.child(timestampKey).setValue(0 - Long.parseLong(dataSnapshot.getValue().toString()));
                } else {
                    upload(/*Starting upload with new timestamp here (this is just a dummy method)*/);
                    timestampReference.child(timestampKey).removeValue();
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e(TAG, databaseError.getMessage());
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

现在我要排序的节点看起来像这样.

{
  "-K_tlLWVO21NXUjUn6ko" : {
    "date" : -1483806697481,
    "debug" : "old",
    ...
  },
  "-K_tmjVqTUcKXHaQDphk" : {
    "date" : -1483807061979,
    "debug" : "newer",
    ...
  },
  "-K_uC-AJIvDOuBzhJ3JJ" : {
    "date" : -1483813945897,
    "debug" : "newest",
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

它们从最新到最旧排序,并RecyclerView按照我的要求添加到我的顶部.

来到我的个人问题:

  • 这是从最新到最旧的节点排序的正确方法吗?这对我来说似乎是一个很大的解决方法.
  • 我错过了什么吗?

提前致谢!

编辑:我刚刚看到我的prepareUpload()方法无用地再次将负值发送到数据库,之后再次接收它...我将更改此值以计算客户端的负值.请忽略这一点.

Ros*_*des 3

不,你没有错过任何东西。是的,这是从最新到最旧对节点进行排序的正确方法。

这就是 firebase 的工作方式。很多时候,您可能会觉得自己正在做一个很大的解决方法,并且认为“必须有一个更简单的方法来做到这一点”,但可能没有。

Firebase 确实是构建应用程序的绝佳平台。但它仍然有一些需要改进的地方,比如实时数据库。我的意思是,无法正确查询您的数据。您也许可以进行一些基本的过滤和排序,但如果您想做更多的事情,就得靠自己了。

为了帮助我们实现这一点,他们为 SQL 开发人员创建了Firebase 数据库系列,您可以在此链接上观看上观看。这些系列解释了 Firebase 上没有正确/默认的数据结构方式。每次启动不同的项目时,您总是需要花几分钟集思广益,思考如何以简化和减少查询的方式构建数据,从而获得更好的性能。

我希望谷歌有一天能够在这项数据服务中实现更多的搜索和过滤功能。