AndroidRoom@Delete 带参数

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

121031 次浏览

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

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

摘自 查询 javadoc:

UPDATE 或 DELETE 查询可以返回 void 或 int Value 是受此查询影响的行数。

房间的美妙之处在于,我们可以摆弄物品。根据需要,你可以使用 为了 Kotlin:

@Delete
fun delete(model: LanguageModel)

Java:

@Delete
void delete(LanguageModel model)

it will delete the exact object which is stored in the db with the same values. LanguageModel is my model class and it works perfectly.

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

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

删除所有行

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

ROOM 数据库为 INSERT、 UPDATE 和 DELETE 数据库中的对象提供了简单的方法。要执行这样的操作,只需要注释@Delete。当删除单个对象成功时,如果 DELETE 操作失败,返回1 else,则返回0,添加返回类型是一个好的实践。

KotlinEG.kt

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

JavaEG.java

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

You can now delete using only partial data.

根据 文件:

@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 (tity = Playlist: : class)注释。