У меня возникла проблема при использовании flatMapConcat
Поток сопрограмм между двумя таблицами с Android Комната. Все изменения в первой таблице не перезапускают поток. Мой код как показано ниже
ArticleCatalogEntity
@Entity(tableName = "ArticleCatalog", indices = [Index("id", unique = true)])
data class ArticleCatalogEntity(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") val id: Int,
@ColumnInfo(name = "articleIds") val articleIds: List<String>
)
Article
@Entity(tableName = "Articles")
data class ArticleEntity(
@PrimaryKey @ColumnInfo(name = "id") val id: String,
@ColumnInfo(name = "name") val name: String
)
ArticleCatalogDAO
@Query("SELECT * FROM ArticleCatalog")
abstract fun getCatalog(): Flow<List<ArticleCatalogEntity>>
@Update
abstract suspend fun update(obj: ArticleCatalogEntity): Int
ArticleDAO
@Query("SELECT * FROM Articles WHERE id in (:ids)")
abstract fun getCatalogArticles(ids: List<String>): Flow<List<ArticleEntity>?>
Я использую этот код для запроса всех каталогов статей
override fun getCatalogArticles(): Flow<List<ArticleEntity>?> {
return articleCatalogDao.getCatalog()
.onEach { Log.v("DEBUG", "catalog updated") }
.distinctUntilChanged()
.map { it.firstOrNull() }
.flatMapConcat { catalog ->
if (catalog == null) {
flow { emit(null) }
} else {
titleDao.getCatalogArticles(catalog.articleIds)
.distinctUntilChanged()
}
}
}
}
Проблема возникает, когда я звоню articleCatalogDao.update(newEntity)
LogCat Log.v("DEBUG", "catalog updated")
вообще не печатается.
Я также пытаюсь изменить код списка статей получения с
titleDao.getCatalogArticles(catalog.articleIds).distinctUntilChanged()
на
flow { emit(titleDao.getCatalogArticles(catalog.titleIds).first()) }
Затем Logcat Log.v("DEBUG", "catalog updated")
печатается как обычно.
Если кто-нибудь знает, почему это происходит, пожалуйста, помогите мне понять. Большое спасибо и извините за мой английский sh.