使用Kotlin协程时Room DAO类出现错误
解决Room协程DAO删除方法的编译错误
嘿,我刚好碰到过这个问题,马上帮你理清!
你遇到的这个编译错误,核心原因是Room对删除(以及更新)类型的DAO方法有严格的返回类型要求,哪怕你给方法加了suspend关键字,这个规则也不会变。错误提示已经说得很清楚了:删除方法必须要么返回void(对应Kotlin里的Unit,或者不写返回类型),要么返回int(对应Kotlin里的Int,表示成功删除的行数)。
问题排查与修复步骤
- 先去检查你的
EventsDao里的删除方法,大概率是你给它设置了不符合要求的返回类型,比如错误示例这样:
@Delete suspend fun deleteEvent(event: Event): Event // 错误:返回了Event实体类,不符合Room规则
把它改成以下两种正确形式之一:
- 不返回任何值(对应Java的void):
@Delete suspend fun deleteEvent(event: Event)- 返回删除的行数(方便你确认操作是否生效):
@Delete suspend fun deleteEvent(event: Event): Int改完之后重新构建项目,这个编译错误应该就会消失了。
额外补充Room DAO方法的返回规则
顺便给你梳理下Room不同操作的返回类型要求,避免以后踩坑:
- 插入操作:可以返回
Long(单条插入的行ID)、LongArray或List<Long>(多条插入的ID列表),当然也可以返回Unit - 更新/删除操作:只能返回
Unit或者Int(受影响的行数) - 查询操作:自由度很高,可以返回实体类、列表、
Flow、LiveData等,加suspend完全没问题
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

