Suspend function dosn't resume inside foreach

Viewed 213

I am using Room Persistence Library inside my Android project. ViewModel class:

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
                    )
                )
            }
        }
    }
}

Repositories:

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)
}

DAOs:

@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)
}

The problem concerns function addShoppingListWithProductsToBuy. toBuyProductRepository.getAllProductsNLD() always returns valid list. But number of iterations in productsToBuy.forEach is random and doesn't depend on size of productsToBuy. The coroutine seems to suspend on productRepository.insert at some point and never resumes.

0 Answers
Related