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

标签 android sorting firebase firebase-realtime-database

我正在使用 FirebaseRecyclerAdapter 用 Firebase 实时数据库提供的数据填充 RecyclerView

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

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

这工作正常,但较新的节点被添加到我的 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());
        }
    });
}

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

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

它们按从最新到最旧的顺序排序,并完全按照我的意愿添加到我的 RecyclerView 的顶部。

来到我的个人问题:

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

提前致谢!

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

最佳答案

不,您没有遗漏任何东西。是的,这是将节点从最新到最旧排序的正确方法。

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

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

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

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

关于android - 正确地将节点从最新到最旧排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41594643/

相关文章:

javascript - 删除/关闭 Firebase 监听器

android - 无法使用 Firebase ICON android 更改我的通知

android - 阻止 Gradle 构建

java - Android应用程序无法解析主机

android - 在 onPostExecute 中启动一个 Activity

c++ - 颠倒排序顺序

javascript - 如何在 Web 应用程序中使用 Firebase 完成用户授权?

android - android中onCreate之前调用的是什么

java - 谜题 - 对文本进行排序?

objective-c - iPhone Obj C——对字典的可变数组进行排序——显示一个字符串但按值排序