首页 > 解决方案 > 在 Android 的 Firebase 存储中按创建时间对项目进行排序

问题描述

我需要按创建时间对 firebase 文件夹中的项目进行排序。创建时间在项目的元数据中。

我已经能够做到这一点,但我觉得使用监听器和“任务”实用程序类有更好的方法来完成它。

我尝试遵循本指南,但我的用例更复杂

getMedatada 文档:https://firebase.google.com/docs/reference/android/com/google/firebase/storage/StorageReference#getMetadata()

getCreationTimeMillis 文档:https://firebase.google.com/docs/reference/android/com/google/firebase/storage/StorageMetadata#g​​etCreationTimeMillis()

这是我的代码:

        FirebaseStorage.getInstance().reference.child(category).listAll().addOnSuccessListener {
        val listOfTalks = mutableListOf<Task<StorageMetadata>>()
        val items = it.items
        items.forEach { listOfTalks.add(it.metadata) } // collecting the list of task for getting the metadata

        val metadataTasks = Tasks.whenAllComplete(listOfTalks) 
        // wait fore all the metadata
        metadataTasks.addOnSuccessListener {
           // put them in a helper class and sort
            val sortedBy = it.map {
                val storageMetadata = it.result as StorageMetadata
                ReferenceAndTimeForSorting(
                    storageMetadata.reference!!,
                    storageMetadata.creationTimeMillis
                )
            }.sortedByDescending { it.timestamp }
            // keep al the references int the result
            storageReferenceList.addAll(sortedBy.map { it.reference })
        }

        metadataTasks.addOnFailureListener {
            // if there is an error getting the metadata, keep the default sorting
            storageReferenceList.addAll(items)
        }
    }

标签: firebasesortingkotlintaskstorage

解决方案


这就是我们最终的结果:

 FirebaseStorage.getInstance()
            .reference
            .child(category)
            .listAll()
            .addOnSuccessListener { listAllResult ->
                val metadataTaskList = listAllResult.items.map { it.metadata }
                Tasks.whenAllComplete(metadataTaskList)
                    .addOnSuccessListener { taskList ->
                        val storageReferenceList = taskList
                            .map { it.result as StorageMetadata }
                            .sortedByDescending { it.creationTimeMillis }
                            .mapNotNull { it.reference }
                        updateGallery(storageReferenceList)
                    }
                    .addOnFailureListener {
                        updateGallery(listAllResult.items)
                    }
            }

推荐阅读