Android - 如何从 Firebase 按插入顺序检索对象列表?
Android - How to retrieve list of objects in their insertion order from Firebase?
我想要什么?
我想从 Firebase 数据库中按插入顺序检索对象列表。
如何将对象添加到 Firebase 数据库中的列表?
mRefUser.push().setValue(new MessageItem());
mRefUser.push().setValue(new MessageItem());
.
.
mRefUser.push().setValue(new MessageItem());
如何添加?
Firebase 将每个对象作为键值对存储在 HashMap 中。
我如何检索这些值?
mFireBaseRefnew.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final Map<String, MessageItem> messageMap = new LinkedHashMap<String, MessageItem>();
if (dataSnapshot != null && dataSnapshot.getValue() != null) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
HashMap<String,MessageItem> messageMap = (HashMap<String, MessageItem>) postSnapshot.getValue();
Collection<MessageItem> messageItems = messageMap.values() ;
List<MessageItem> messageItemList = new ArrayList<MessageItem>();
messageItemList.addAll(messageItems);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
我得到了什么?
最后一记:-
哈希映射键的顺序是随机的。有什么方法可以获取链接的哈希映射而不是哈希映射。我不想存储密钥,因为数据库正在维护顺序,应该有某种方法可以让它们按相同的顺序排列,但我不知道如何获取它们。
你读过文档吗?数据键是基于时间戳的,因此它们按时间排序。要获得排序查询,您必须在数据库引用上使用 orderByKey()
。更多相关信息 https://firebase.google.com/docs/database/android/retrieve-data#sorting_and_filtering_data
这里有一个例子可以更清楚地说明Dima Rostopira先生的反应。你看到 "orderByKey()" 了吗?
mFireBaseRefnew.orderByKey().addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final Map<String, MessageItem> messageMap = new LinkedHashMap<String, MessageItem>();
if (dataSnapshot != null && dataSnapshot.getValue() != null) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
HashMap<String,MessageItem> messageMap = (HashMap<String, MessageItem>) postSnapshot.getValue();
Collection<MessageItem> messageItems = messageMap.values() ;
List<MessageItem> messageItemList = new ArrayList<MessageItem>();
messageItemList.addAll(messageItems);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
要检索已排序的数据,请先指定其中一种排序方式。
更多
https://firebase.google.com/docs/database/android/lists-of-data
如果您在 class 中有 HashMap 并且想使用 getValue(Classname.class)
获取整个 firebase 对象
下面的方法可以帮到你
从 HashMap 将其放入 TreeMap 中,您将像在 firebase 中那样通过键对列表进行排序
示例代码
TreeMap<String,Recordings> recordingsTreeMap = new TreeMap<>();
recordingsTreeMap.putAll(project.getRecordings());
您将在 TreeMap 对象中按键排序列表。
其中项目是一个 class 具有多个字段和一个或多个 HashMap 并且您不想单独查询每个。
我想要什么?
我想从 Firebase 数据库中按插入顺序检索对象列表。
如何将对象添加到 Firebase 数据库中的列表?
mRefUser.push().setValue(new MessageItem());
mRefUser.push().setValue(new MessageItem());
.
.
mRefUser.push().setValue(new MessageItem());
如何添加?
Firebase 将每个对象作为键值对存储在 HashMap 中。
我如何检索这些值?
mFireBaseRefnew.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final Map<String, MessageItem> messageMap = new LinkedHashMap<String, MessageItem>();
if (dataSnapshot != null && dataSnapshot.getValue() != null) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
HashMap<String,MessageItem> messageMap = (HashMap<String, MessageItem>) postSnapshot.getValue();
Collection<MessageItem> messageItems = messageMap.values() ;
List<MessageItem> messageItemList = new ArrayList<MessageItem>();
messageItemList.addAll(messageItems);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
我得到了什么?
最后一记:-
哈希映射键的顺序是随机的。有什么方法可以获取链接的哈希映射而不是哈希映射。我不想存储密钥,因为数据库正在维护顺序,应该有某种方法可以让它们按相同的顺序排列,但我不知道如何获取它们。
你读过文档吗?数据键是基于时间戳的,因此它们按时间排序。要获得排序查询,您必须在数据库引用上使用 orderByKey()
。更多相关信息 https://firebase.google.com/docs/database/android/retrieve-data#sorting_and_filtering_data
这里有一个例子可以更清楚地说明Dima Rostopira先生的反应。你看到 "orderByKey()" 了吗?
mFireBaseRefnew.orderByKey().addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final Map<String, MessageItem> messageMap = new LinkedHashMap<String, MessageItem>();
if (dataSnapshot != null && dataSnapshot.getValue() != null) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
HashMap<String,MessageItem> messageMap = (HashMap<String, MessageItem>) postSnapshot.getValue();
Collection<MessageItem> messageItems = messageMap.values() ;
List<MessageItem> messageItemList = new ArrayList<MessageItem>();
messageItemList.addAll(messageItems);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
要检索已排序的数据,请先指定其中一种排序方式。 更多 https://firebase.google.com/docs/database/android/lists-of-data
如果您在 class 中有 HashMap 并且想使用 getValue(Classname.class)
获取整个 firebase 对象下面的方法可以帮到你
从 HashMap 将其放入 TreeMap 中,您将像在 firebase 中那样通过键对列表进行排序
示例代码
TreeMap<String,Recordings> recordingsTreeMap = new TreeMap<>();
recordingsTreeMap.putAll(project.getRecordings());
您将在 TreeMap 对象中按键排序列表。
其中项目是一个 class 具有多个字段和一个或多个 HashMap 并且您不想单独查询每个。