我正在使用 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/