作者:迪信通-加盟部 | 来源:互联网 | 2023-02-10 19:38
我遇到了一个奇怪的问题,其中使用的Firebase查询orderByChild()
实际上并没有对数据进行排序.下面是我正在尝试订购的数据的快照:(为了这个例子,总数是关闭的)
这是我到目前为止使用的代码:
Query query = locationComment.orderByKey();
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() == null) {
return;
}
data.clear();
adapter.notifyDataSetChanged();
String userId;
String time;
String comment;
Map commentMap = (Map) dataSnapshot.getValue();
for (Map.Entry entry : commentMap.entrySet()) {
if(!((entry.getKey()).contains("total"))) {
String[] keyString = (entry.getKey()).split(",");
time = keyString[0];
userId = keyString[1];
comment = entry.getValue();
Date resultdate = new Date(Integer.parseInt(time));
data.add(new Comment(comment,
DateFormat.getDateTimeInstance().format(resultdate), userId));
adapter.notifyItemInserted(data.size());
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我得到了每一个键值对(除了总数),除了它没有按预期排序(按键排序).Firebase文档说,如果密钥无法解析为32位整数,则按字典顺序排序.
无论哪种方式,顺序应该如图所示,但我循环通过地图时返回的数据不是这个顺序.
如果有人能指出我正确的方向,我真的很感激.谢谢!
1> Frank van Pu..:
执行查询时,您会得到三件事:
他们的钥匙
价值
这些之间的相对顺序
当您将结果转换为a时,Map
它只能容纳其中的两个,因此订单将丢失.为防止这种情况,您应该使用以下DataSnapshot.getChildren()
方法:
Query query = locationComment.orderByKey();
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() == null) {
return;
}
data.clear();
for (DataSnapshot child : dataSnapshot.getChildren()) {
...
}
adapter.notifyDataSetChanged();
}
另请参阅Firebase文档中有关使用列表的示例:https://firebase.google.com/docs/database/android/lists-of-data#listen_for_value_events