Kotlin 如何使用Cloud Firestore向文档添加其他收集数据?

Kotlin 如何使用Cloud Firestore向文档添加其他收集数据?,kotlin,mvvm,google-cloud-firestore,android-livedata,kotlin-coroutines,Kotlin,Mvvm,Google Cloud Firestore,Android Livedata,Kotlin Coroutines,数据从cloud firestore(红色)读取,这是静态数据,存储在本地的房间数据库中 还有一些“进度”数据是动态的,每个用户的数据不同。位于progress集合中的字段是一个时间戳,必须添加到旅程对象的lastOpened属性中,并且位于以userId作为documentId的文档中 我是firebase API的初学者,我知道所有调用都是异步的,但我似乎没有想到在调用对象时将属性“progress”(黄色)添加到对象(红色)中的方法 我可以在应用程序中实现这一点,还是需要重新安排保存数据

数据从cloud firestore(红色)读取,这是静态数据,存储在本地的房间数据库中

还有一些“进度”数据是动态的,每个用户的数据不同。位于progress集合中的字段是一个时间戳,必须添加到
旅程
对象的
lastOpened
属性中,并且位于以userId作为documentId的文档中

我是firebase API的初学者,我知道所有调用都是异步的,但我似乎没有想到在调用对象时将属性“progress”(黄色)添加到对象(红色)中的方法


我可以在应用程序中实现这一点,还是需要重新安排保存数据的方式?

您用黄色勾勒出的内容将不是“属性”。那将是一个次级集合。您可以在它下面嵌套更多文档,就像您已经有了“章节”一样

没有用于创建子集合的API。只要开始正常地向它写入文档,它就会在需要时被创建


如果您要求向文档中写入其他字段,就像您在description和image中所做的那样,那么您只需对该文档的引用调用
update()

我指的是对象的属性。我检索该对象,然后稍后使用其Id检索进度。然后将其添加到该对象中。Firestore没有属性和对象。它有集合、文档和字段。你在Firestore中建模的所有东西都应该围绕这些概念。但在本地,它是我在kotlin android应用程序中使用的对象。我从firebase上读到它,并将其存储在设备(Android Room)上。也许你想编辑这个问题,以显示你的代码没有按照你期望的方式工作,并添加更多关于你试图用这些代码实现什么的细节。在一天结束时,您将不得不处理集合、文档和字段,以使数据库中的内容有意义。我添加了更多信息。希望这有助于:)为了更好地理解,请重新措辞这个问题。进步不是财产
private val _fetchedJourneys = MutableLiveData<List<Journey>>()
override val fetchedJourneys: LiveData<List<Journey>>
   get() = _fetchedJourneys

    override suspend fun getJourneys() {
        FirebaseFirestore.getInstance()
                .collection(COLLECTION_JOURNEY)
                .get()
                .addOnCompleteListener { task ->
                    if (task.isSuccessful) {

                        val fetchedJourneys = arrayListOf<Journey>()

                        for (queryDocumentSnapshot in task.result!!) {
                            val journey = queryDocumentSnapshot.toObject(Journey::class.java)
                            journey.id = queryDocumentSnapshot.id

                           // At this point I have the journey ID, which in return I  
                           // need to query the progress collection to look for the timestamp and add 
                           // its value it to journey.lastOpened

                            fetchedJourneys.add(journey)
                        }

                        _fetchedJourneys.postValue(fetchedJourneys)

                        Timber.d("Fetched ${fetchedJourneys.size} journeys remotely")

                    } else {
                        Timber.e(task.exception!!.message, "Failed to fetch remote journeys")
                    }
                }

    }
@Entity(tableName = "journeys")
@IgnoreExtraProperties
@Parcelize
data class Journey(
        @PrimaryKey(autoGenerate = false)
        @SerializedName("journey_id")
        var id: String = "",
        val title: String = "",
        val description: String = "",
        val image: String = "",
        @ColumnInfo(name = "last_opened")
        var lastOpened: String = ""
) : Parcelable