使用Flow将项目存储在Room数据库中



在我的任务中,我从API获取项目,并需要将其存储到Room数据库中。

这是我的物品刀:

@Query("SELECT * FROM item_table")
fun getAllItems(): Flow<List<ItemLocal>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertItem(item: ItemLocal)

存储库:在这里我从ItemResponse(api-Item(映射到ItemLocal

suspend fun getItems(): List<ItemLocal> {
return apiService.getItems()?.items?.map {
ItemLocal(
ItemId = "1",
author = it.author.orEmpty(),
title = it.title.orEmpty(),
)
} ?: emptyList()
}

ViewModel:

private val _itemList = MutableStateFlow(emptyList<ItemLocal>())
viewModelScope.launch {
_itemList.update {
itemRepository.getItems()
}
}
fun addItemsToDatabase(items: List<ItemLocal>) = viewModelScope.launch {
itemRepository.insertItemsToDatabase(items)
}

主要活动:

lifecycleScope.launch {
viewModel.itemList.collect { listOfItems ->
viewModel.addItemToDatabase(listOfItems)
}
}

此代码只放入1个Item(应该会返回更多(。我也尝试过在ViewModel中使用.forEach逐个放置对象,但它也只返回1个项。我需要将所有项目存储到Room数据库中。

编辑:

@Entity(tableName = "item_table")
data class ItemLocal(
val author: String,
@PrimaryKey(autoGenerate = false)
val title: String,
)

在代码段中,您为服务器提供的每个项目使用修复"1"ItemId,因此Room数据库会逐一替换它们。要保存所有项目,您应该为项目提供唯一的ID(手动或使用自动递增SQL选项(。请提供更多信息(LocalItem型号(以澄清情况。

最新更新