通过WHERE IN子句无法删除房间的多行

时间:2019-03-25 15:30:44

标签: android sqlite android-room

我想通过DELETE FROM...WHERE...IN (...)子句在Android Room中按其ID删除多行。下面是代码:

ItemDao

@Dao
interface ItemDao {
    @Query("DELETE FROM Item WHERE id IN (:ids)")
    fun deleteItemByIds(ids: String)
}

ItemViewModel

class ItemViewModel(application: Application) : AndroidViewModel(application) {
    fun deleteByIds(ids: String) {
        mScope.launch(Dispatchers.IO) {
            mItemDao.deleteItemByIds(ids)
        }
    }
}

ItemActivity

fun onDelete(){
    // these are not real IDs, just for demo
    val itemIdList = arrayListOf<Long>(1, 2, 3)
    val ids = itemIdList.toString().drop(1).dropLast(1) // ids = "1, 2, 3"
    itemViewModel.deleteByIds(ids)
}

只有一个ID时,代码有效。但是,当有多个ID时,没有。那这里怎么了感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

在处理WHERE IN子句时,您需要传递数组或列表。喜欢:

@Dao
interface ItemDao {
    @Query("DELETE FROM Item WHERE id IN (:ids)")
    fun deleteItemByIds(ids: Array<Long>)
}

答案 1 :(得分:1)

我知道这个问题要求删除带有 Id 列表的行,但是当我传递 10k+ Id 时,我的应用程序崩溃了。 所以我尝试传递对象本身,它对我有用。

@Dao
interface ItemDao {

    @Delete
    fun deleteUserByList(userList: Array<User>)

}

这样我可以删除超过 10k 行。

万一有人需要它。