带有参数的Android Room @Delete


75

我知道我不能DELETE在查询中使用(顺便说一句很遗憾),我会收到以下错误:

<i>Error:error: Observable query return type (LiveData, Flowable etc) can only be used with SELECT queries that directly or indirectly (via @Relation, for example) access at least one table.</i>

但是我不能使用@Delete(WHERE... xxx) 那么,如何通过参数删除特定行?

Answers:


65

房间的美在于,我们玩的是物体。根据要求,您可以使用kotlin:

@Delete
fun delete(model: LanguageModel)

对于Java:

@Delete
void delete(LanguageModel model)

它将删除存储在数据库中的具有相同值的确切对象。LanguageModel是我的模型类,它可以完美运行。


15
只是一个小小的观察:文档仅提到了带@Delete注释方法的主键匹配。尚不清楚如果模型中没有主键定义,将会发生什么。
dbm

如果要“删除具有相同值的精确存储在数据库中的对象”,那将是无用的,因为对象在数据库中发生了变化,以后删除它们不需要我知道它们的确切数据。我只需要知道主键。
Alaa M.

228

实际上,您可以@Query用来执行删除。

@Query("DELETE FROM users WHERE user_id = :userId")
abstract void deleteByUserId(long userId);

查询javadoc中提取:

UPDATE或DELETE查询可以返回void或int。如果它是整数,则值是此查询影响的行数。


2
这项工作有效,我一直在使用类似的方法,并且删除所有内容的方式也是这样。供参考,请检查以下内容:(stackoverflow.com/a/44249498/2185548
Gama大帝

由于某种原因,@ Delete对我不起作用。但这有效!
拉克什

2
@Rakesh您的实体中可能具有自动生成的主ID,这意味着您只能使用某些参数来删除,例如此处的“ userId”。
Ajith Memana

有两个问题,因为我有一个自动生成的主ID dos,这意味着即使对于我的更新方法,我也必须使用一个id,delete(普通)查询与delete有什么区别id
乔治·乌德森

10

您可以使用以下方法通过ID进行删除

@Query("DELETE FROM yourDB WHERE id = :id")
void deleteById(int id);

用于删除所有行

@Query("DELETE FROM yourDB")
void delete();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.