在我的Android应用程序中,我使用以下代码
+0
我的firebase数据库结构是
与方案相关的我的Firebase规则是
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) {
}
});
问题是我以默认排序方式从快照获取hasmap,即sortbyKey()。但我期望结果基于节点数据中的时间键值。
答案 0 :(得分:2)
当您对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添加了一个示例。