带有参数的Android Room @Delete

Jac*_*ack 45 java sql android android-room

我知道我不能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>
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ues 119

实际上,您可以使用它@Query来执行删除.

@Query("DELETE FROM users WHERE user_id = :userId")
abstract void deleteByUserId(long userId);
Run Code Online (Sandbox Code Playgroud)

Query javadoc中提取:

UPDATE或DELETE查询可以返回void或int.如果是int,则该值是受此查询影响的行数.

  • 这工作,我一直在使用这样的东西和*删除所有*也是这样写的.供参考检查:(/sf/answers/3097464891/) (2认同)
  • @Rakesh 您的实体中可能有一个自动生成的主 ID,这意味着您只能删除使用某些参数,例如此处的“userId”。 (2认同)

Awa*_*ais 43

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

@Delete
fun delete(model: LanguageModel)
Run Code Online (Sandbox Code Playgroud)

对于Java:

@Delete
void delete(LanguageModel model)
Run Code Online (Sandbox Code Playgroud)

它将使用相同的值删除存储在db中的确切对象.LanguageModel是我的模型类,它完美地运行.

  • 只是一个小小的观察:[文档](https://developer.android.com/training/data-storage/room/accessing-data#convenience-delete)仅提到匹配"@ Delete"注释方法的主键.如果模型中没有主键定义,将会发生什么有点不清楚. (8认同)
  • 如果它是“删除存储在数据库中具有相同值的确切对象”,那将是无用的,因为对象在数据库中发生变化,并且稍后删除它们不应该要求我知道它们的确切数据;我只需要知道主键。 (3认同)
  • @dbm roomdb 中的实体至少需要一个主键 (2认同)
  • 这不是优点,如果你知道要删除的 id 但不想获取整个对象,那就很麻烦 (2认同)

Fax*_*yev 22

您可以使用以下方法按 ID 删除

@Query("DELETE FROM yourDatabaseTable WHERE id = :id")
void deleteById(int id);
Run Code Online (Sandbox Code Playgroud)

删除所有行

@Query("DELETE FROM yourDatabaseTable")
void delete();
Run Code Online (Sandbox Code Playgroud)

  • @MarkDelphi如果“删除”操作成功,它将返回已删除的行数。因此返回“-1”意味着操作失败。 (4认同)

小智 6

ROOM 数据库提供了在数据库中插入、更新和删除对象的简单方法。执行这样的操作只需要注释@Delete即可。DELETE操作返回 Int,当删除单个对象成功时返回 1,否则返回 0 如果 DELETE 操作不成功,添加返回类型是一个很好的做法。

KotlinEG.kt

   @Dao
   interface EntityLocalDAO {
       @Delete
       fun deleteData(entityObject: EntityObject) : Int
   }
Run Code Online (Sandbox Code Playgroud)

javaEG.java

   @Dao
   interface EntityLocalDAO {
       @Delete
       int deleteData(EntityObject entityObject);
   }
Run Code Online (Sandbox Code Playgroud)