You need to enable JavaScript to run this app. Android Room配合Dagger Hilt使用时Insert方法无反应、未插入数据问题
优惠活动
大模型
产品
解决方案
定价
更多

Android Room配合Dagger Hilt使用时Insert方法无反应、未插入数据问题

问题修复方案

核心问题:异步调用逻辑错误

你当前的插入操作是在ViewModel的协程中异步执行的,且方法没有定义返回值,Fragment中直接取返回值时,插入操作还未执行,拿到的只是默认的Unit类型,同时异步过程中的报错也无法被捕获。

修复步骤

  1. 修改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作为标识
        }
    }
}
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 02:15:03