在我的 android 应用程序中,我使用以下代码
FirebaseDatabase database = FirebaseDatabase.getInstance();
ref = database.getReference().child(Keys.CONTACTIFY_CONTACTS).child(sharedPrefs.getString(SharedPreferenceValues.CURRENT_USER_UID, "")).child(Keys.SHARED_CONTACTS);
refer = ref.orderByChild(Keys.TIME);
refer.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ArrayList<HashMap<String, Object>> sharedList = new ArrayList<HashMap<String, Object>>();
if (dataSnapshot.getValue() != null) {
Object[] rootData = ((HashMap<String, Object>) dataSnapshot.getValue()).values().toArray();
for (Object singleElement :
rootData) {
HashMap<String, Object> eachElement = (HashMap<String, Object>) singleElement;
sharedList.add(eachElement);
}
recyclerView.setAdapter(new SharedItemsRecyclerViewAdapter(sharedList, mListener, getActivity()));
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我的firebase数据库结构是
我的与场景相关的 Firebase 规则是
{
"rules": {
"mapper":{
".read": "auth!= null",
".write": "auth!= null"
},
"share_id_mapper":{
".read": "auth!= null",
".write": "auth!= null"
},
"contactify_contacts":{
//can read a message if authenticated
"$uid": {
"shared_contacts": {".indexOn": "time",
".write": "auth!= null",
问题是我以默认排序方式从快照获取 hasmap,即 sortbyKey()。但我期待基于节点数据中时间键值的结果。
最佳答案
当您对 Firebase 数据库执行查询时,它返回的 DataSnapshot
包含键、值和结果的顺序。
但随后您将快照转换为 Map
:
((HashMap<String, Object>) dataSnapshot.getValue())
此时,Firebase 客户端别无选择,只能删除有关结果顺序的信息。
解决方案是使用 DataSnapshot
中的方法遍历快照的子级,然后才转换值:
public void onDataChange(DataSnapshot dataSnapshot) {
List<String, Object> data = new ArrayList<String,Object>();
for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
data.add(childSnapshot.getKey(), childSnapshot.getValue());
}
}
我们最近在我们的 query documentation 中添加了一个示例.
关于android - OrderByChild() 在 Android 客户端中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39615658/