Kotlin 如何使用Cloud Firestore向文档添加其他收集数据?
数据从cloud firestore(红色)读取,这是静态数据,存储在本地的房间数据库中 还有一些“进度”数据是动态的,每个用户的数据不同。位于progress集合中的字段是一个时间戳,必须添加到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”(黄色)添加到对象(红色)中的方法 我可以在应用程序中实现这一点,还是需要重新安排保存数据
旅程
对象的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