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 并且您不想单独查询每个。