Android 暂停函数dosn';不要在foreach内恢复
我正在Android项目中使用Room持久性库。 ViewModel类:Android 暂停函数dosn';不要在foreach内恢复,android,kotlin,android-room,coroutine,Android,Kotlin,Android Room,Coroutine,我正在Android项目中使用Room持久性库。 ViewModel类: class ShoppingListsViewModel( private val toBuyProductRepository: ToBuyProductRepository, private val shoppingListRepository: ShoppingListRepository, private val productRepository: ProductRepository )
class ShoppingListsViewModel(
private val toBuyProductRepository: ToBuyProductRepository,
private val shoppingListRepository: ShoppingListRepository,
private val productRepository: ProductRepository
) : ViewModel() {
fun addShoppingListWithProductsToBuy(listName: String) {
viewModelScope.launch {
val listId: Long = shoppingListRepository.insertList(ShoppingList(listName))
val productsToBuy: List<ToBuyProduct> = toBuyProductRepository.getAllProductsNLD()
productsToBuy.forEach {
productRepository.insert(
Product(
ProductDetails(productName = it.name),
listId
)
)
}
}
}
}
DAOs:
该问题涉及函数
添加ShoppingListWithProductsToBuy
toBuyProductRepository.getAllProductsNLD()
始终返回有效列表。但是,productsToBuy.forEach
中的迭代次数是随机的,并不取决于productsToBuy
的大小。协同程序似乎在productRepository上挂起。请在某个时间插入,并且永远不会恢复。val l=productsToBuy.map{Product(ProductDetails(productName=it.name),listId)}
替换当前的insert
或向ProductRepository
和ProductDao
添加新功能,它们接收列表
,并一次插入整个列表,而不是插入每个项目
class ShoppingListRepository(
private val shoppingListDao: ShoppingListDao
) {
suspend fun insertList(list: ShoppingList): Long = shoppingListDao.insertList(list)
}
class ToBuyProductRepository(
private val toBuyProductDao: ToBuyProductDao
) {
suspend fun getAllProductsNLD(): List<ToBuyProduct> = toBuyProductDao.getAllProductsNLD()
}
class ProductRepository(
private val productDao: ProductDao
) {
suspend fun insert(product: Product) = productDao.insert(product)
}
@Dao
interface ShoppingListDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertList(list: ShoppingList): Long
}
@Dao
interface ToBuyProductDao {
@Query("SELECT * FROM tobuyrecord")
suspend fun getAllProductsNLD(): List<ToBuyProduct>
}
@Dao
interface ProductDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(product: Product)
}