Android 带参数的房间@Delete

Android Room @Delete with parameters

我知道我不能在查询中使用 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) 那么如何通过参数删除特定行呢?

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

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

摘自Query javadoc

UPDATE or DELETE queries can return void or int. If it is an int, the value is the number of rows affected by this query.

房间的美妙之处在于,我们可以玩弄物品。根据要求,您可以使用 对于科特林:

@Delete
fun delete(model: LanguageModel)

对于 Java:

@Delete
void delete(LanguageModel model)

它将删除存储在数据库中具有相同值的确切对象。 LanguageModel 是我的模型 class,它工作得很好。

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

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

用于删除所有行

@Query("DELETE FROM yourDatabaseTable")
void delete();

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

KotlinEG.kt

   @Dao
   interface EntityLocalDAO {
       @Delete
       fun deleteData(entityObject: EntityObject) : Int
   }

javaEG.java

   @Dao
   interface EntityLocalDAO {
       @Delete
       int deleteData(EntityObject entityObject);
   }

您现在可以仅使用部分数据进行删除。

根据 documentation:

@Entity
data class Playlist (
    @PrimaryKey
    val playlistId: Long,
    val ownerId: Long,
    val name: String,
    @ColumnInfo(defaultValue = "normal")
    val category: String
)

data class OwnerIdAndCategory (
    val ownerId: Long,
    val category: String
)

@Dao
public interface PlaylistDao {
    @Delete(entity = Playlist::class)
    fun deleteByOwnerIdAndCategory(varargs idCategory: OwnerIdAndCategory)
}

在此示例中,您可以看到他们正在删除仅使用 ownerId 和类别的播放列表。您甚至不需要使用主键 (playlistId)。

关键是使用@Delete(entity = Playlist::class)注解。