flatMapConcat Kotlin поток сопрограмм с Android комнатой - PullRequest
0 голосов
/ 05 марта 2020

У меня возникла проблема при использовании 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.

...