构建Android项目时Room数据库报Invalid query argument错误求助
错误通用含义
该错误是Room在编译阶段做代码校验时抛出的异常,代表你给Room操作注解(@Query、@Delete、@Update等)传入的参数类型不符合规则,Room注解处理器无法识别该参数对应的数据库操作逻辑。
本次报错触发原因
问题出在Dao类的最后一个删除方法:
@Delete(entity = ParsedDatabase::class) fun delete(id: Int = 1)
Room原生@Delete注解仅支持传入实体类对象或者实体类对象集合作为参数,内部会自动匹配传入实体的主键值来定位要删除的行。你直接传入Int类型的主键id,不符合@Delete的参数要求,因此触发了校验报错。
修复步骤
将上述按id删除的方法替换为@Query自定义SQL的写法即可,修改后代码如下:
// 删除原来的@Delete注解的对应方法,替换为以下代码 @Query("DELETE FROM parsed_database WHERE id = :id") fun delete(id: Int = 1)
额外注意事项
- 你在实体类中使用了HashMap、ArrayList、嵌套ArrayList
等Room不支持直接存储的复杂类型,请确保你声明的 Converters类型转换器已经正确实现了这些复杂类型和基础存储类型(如String、ByteArray)之间的序列化、反序列化逻辑,避免后续运行时出现类型转换错误。 - 你的实体类主键id默认值固定为1,代表该表最多只会存储1条数据,若你的业务场景后续需要存储多条数据,请调整主键生成策略。
内容的提问来源于stack exchange,提问作者Roman Popov
相关产品推荐
相关产品推荐

