XML填充时ViewModel适配器初始化异常排查求助
解决TaskTimer应用SQLite参数绑定越界导致的ViewModel实例化崩溃
问题核心是SQL语句中占位符(?)的数量和实际传入的参数数量不匹配,触发SQLite参数绑定越界错误,导致TaskTimerViewModel初始化时数据查询失败,进而引发XML填充崩溃。以下是具体修复步骤:
核对DAO层SQL与参数绑定
找到ViewModel中对应查询的SQL语句,数清楚其中?的数量,再对比实际传入的参数数组/列表长度。比如SQL写了SELECT * FROM tasks WHERE id = ? AND status = ?,但只传了1个参数,这就会触发错误。必须保证占位符和参数数量完全一致。检查ViewModel查询逻辑
查看TaskTimerViewModel里初始化cursor的代码,确认异步查询(比如LiveData包裹的查询操作)时的参数传递是否遗漏或多传。例如:// 错误示例:SQL需要2个参数但只传了1个 val taskCursor = taskRepository.getFilteredTasks(selectedId)修正参数传递,确保每个占位符都有对应的参数值。
验证SQLite/Room的查询实现
- 原生SQLite:检查
rawQuery方法的第二个参数数组长度是否和占位符数量匹配; - Room框架:确认
@Query注解中的SQL占位符和方法参数一一对应,比如:
补充缺失的参数或者调整SQL语句。// 错误示例:占位符数量与参数数量不匹配 @Query("SELECT * FROM tasks WHERE category = ? AND priority = ?") fun getTasksByCategory(category: String): LiveData<Cursor>
- 原生SQLite:检查
添加参数校验防崩溃
在查询方法中增加参数数量合法性校验,提前拦截非法参数,比如:fun getFilteredTasks(vararg params: Any): LiveData<Cursor> { require(params.size == 2) { "该查询需要2个参数,实际传入${params.size}个" } // 执行查询逻辑 ... }
内容的提问来源于stack exchange,提问作者Ben Edwards
相关产品推荐
相关产品推荐

