【发布时间】:2021-12-17 12:59:19
【问题描述】:
我的 android 本地数据库中有表 Stories。
问题:
当我设置story.isSeen = true 并将其保存到本地数据库时,我在distinctUntilChanged { old, new -> } 中获得了可观察的数据,但old 和new 的值总是相同的。
old[n].isSeen 是真的,虽然它是假的。
distinctUntilChanged() 也没有工作。
故事结构:
@Keep
@Entity(tableName = "stories")
@Parcelize
data class Story (
@PrimaryKey
var id: Int,
var name: String,
var iconName: String,
var isAttached: Boolean = false,
var lastShownPosition: Int,
var isSeen: Boolean = false,
@TypeConverters(DateConverter::class)
var expiresAt: Date,
@TypeConverters(DateConverter::class)
var createdAt: Date,
@TypeConverters(StoryItemsConverter::class)
var items: List<StoryItem>
): Parcelable
我用Flow来观察数据:
@Query("SELECT * FROM stories WHERE :today <= expiresAt LIMIT :limit OFFSET :offset ")
fun getStories(today: Long, limit: Int = -1, offset: Int = 0): Flow<MutableList<Story>>
以及我如何观察它们:
suspend fun getStories(sync: Boolean = false, params: JSONObject = defaultStoriesQueryParams) {
val today = System.currentTimeMillis()
storiesDao.getStories(today).distinctUntilChanged { old, new ->
if (new.size != old.size) return@distinctUntilChanged false
for (i in 0..new.size) {
if (old[i].isSeen != new[i].isSeen) return@distinctUntilChanged false
}
return@distinctUntilChanged true
}.collect { newData ->
if (newData.isNullOrEmpty()) {
_storiesFlow.emit(StoriesResource.Loading())
val remoteData = syncStories(params)
when {
remoteData == null -> _storiesFlow.emit(StoriesResource.Error("Request error"))
remoteData.code != 200 -> _storiesFlow.emit(StoriesResource.Error(remoteData.message))
remoteData.code == 200 && remoteData.payload.isNullOrEmpty() -> _storiesFlow.emit(StoriesResource.Empty())
}
} else {
_storiesFlow.emit(StoriesResource.Data(newData))
}
}
}
我如何保存更改:
fun update(story: Story) {
GlobalScope.launch(Dispatchers.IO) {
storiesDao.updateStories(story)
}
}
附:对不起我的英语,如果做错了。
【问题讨论】:
标签: android android-room coroutine flow