Android Room配合Dagger Hilt使用时Insert方法无反应、未插入数据问题
问题修复方案
核心问题:异步调用逻辑错误
你当前的插入操作是在ViewModel的协程中异步执行的,且方法没有定义返回值,Fragment中直接取返回值时,插入操作还未执行,拿到的只是默认的Unit类型,同时异步过程中的报错也无法被捕获。
修复步骤
- 修改ViewModel插入方法,改为挂起函数方便调用处接收返回值,同时增加异常捕获:
@HiltViewModel class ProductViewModel @Inject constructor( private val productDao : CartDao ) : ViewModel() { suspend fun insert_item_to_cart(product: Product): Long { return try { productDao.insert_item_to_cart(product) } catch (e: Exception) { Log.e("DB_INSERT", "插入失败", e) -1 // 插入失败返回-1作为标识 } } }
- 修改Fragment点击逻辑,在生命周期协程中调用挂起函数,确保插入执行完成后再打印日志:
btn_add_to_cart.setOnClickListener { lifecycleScope.launch { val product = args.productData.copy( color = selected_color, size = selected_size ) // 可先打印待插入数据确认参数正确 Log.d("CHECK_PARAM", "待插入数据:$product") val insertedId = viewModel.insert_item_to_cart(product) Log.d(TAG, "Inserted : ${insertedId}") } }
其他问题排查&优化
- 检查传入Product的
id字段有效性:你设置了id为字符串类型主键,若传入空值或者重复值,OnConflictStrategy.REPLACE会直接覆盖旧数据,不会抛出异常,返回的主键仍为对应行的行号 - 补充DAO方法的挂起标识:当前
delete_all_cart()方法没有加suspend修饰,后续调用时会触发主线程操作数据库的崩溃,建议修改为:
@Query("Delete FROM product_table") suspend fun delete_all_cart()
- 调试阶段可开启Room日志,查看SQL实际执行情况:
Room.databaseBuilder( app, ProductDatabase::class.java, "product_db" ) .setJournalMode(RoomDatabase.JournalMode.WRITE_AHEAD_LOGGING) .build()
内容的提问来源于stack exchange,提问作者MU'men Ahmed
相关产品推荐
相关产品推荐

