正确排序从最新到最旧的节点

我正在使用FirebaseRecyclerAdapter通过Firebase实时数据库提供的数据为RecyclerView充气。

我开始按节点date对节点进行排序,该date被设置为ServerValue.TIMESTAMP的值。 我将indexOn属性添加到了我想要将值date排序到Firebase数据库规则的节点的父节点。

"parent-node": {
  ".read": "auth != null",
  ".write": "auth != null",
  ".indexOn" : "date",
  ...
}, 

这工作正常,但新的节点添加到我的RecyclerView的结尾。 由于FirebaseRecyclerAdapter及其FirebaseArray用添加节点ChildEventListener ,这意味着数据进行了排序,从最旧到最新

我设法通过使用ServerValue.TIMESTAMP的负值来反转这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());
        }
    });
}

现在我想排序的节点看起来像这样。

{
  "-K_tlLWVO21NXUjUn6ko" : {
    "date" : -1483806697481,
    "debug" : "old",
    ...
  },
  "-K_tmjVqTUcKXHaQDphk" : {
    "date" : -1483807061979,
    "debug" : "newer",
    ...
  },
  "-K_uC-AJIvDOuBzhJ3JJ" : {
    "date" : -1483813945897,
    "debug" : "newest",
    ...
  }
}

它们从最新到最旧排序,并按我的RecyclerView添加到我的RecyclerView的顶部。

回答我个人的问题:

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

    编辑:我刚刚看到我的prepareUpload()方法无用地将负值发送到数据库再次,只是为了再次接收它..我会改变这个来计算客户端的负值。 请忽略此。


    不,你不会错过任何东西。 是的,这是将节点从最新到最旧排序的正确方法。

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

    Firebase确实是构建应用程序的绝佳平台。 但它仍然有一些需要改进的地方,比如实时数据库。 我的意思是,没有办法正确查询你的数据。 您可能可以进行一些基本的过滤和排序,但如果您想要做的不仅仅是这些,而是​​您自己。

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

    我希望有一天Google可以在这个数据服务中实现更多的搜索和过滤功能。


    就获得您想要的排序顺序而言,是的,倒序时间戳就是答案。 查看这个较旧的答案:https://stackoverflow.com/a/25613337/4816918了解更多信息。

    .indexOn键仅用于性能优化(请参见“索引数据”页面的底部,因此请求有序数据的正确方法是在查询中使用.orderByChild.orderByKey.orderByValue 。查找“ “在Android上使用数据列表”页面中的“排序数据”部分。


    你所做的是绝对正确的。 唯一的区别是,你应该同时拥有一个timestamp和一个negativeTimestamp timestamp密钥,以防万一你需要任何一个。 无论如何,这一切都取决于您的要求。

    来自Firebase的事实上的人也表示同样的看法。 你可以观看这个YouTube视频并移至04:40,从Firebase团队自己查看你的问题的答案。

    链接地址: http://www.djcxy.com/p/37927.html

    上一篇: Correctly sort nodes from newest to oldest

    下一篇: Vectorized Lookups of Pandas Series to a Dictionary