Android 文件室按WHERE IN子句删除多行不起作用

Android 文件室按WHERE IN子句删除多行不起作用,android,sqlite,android-room,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) : An

我想通过(…)中的
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)
        }
    }
}
项目活动

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)
}
fun-onDelete(){
//这些不是真实的ID,只是为了演示
val itemIdList=arrayListOf(1,2,3)
val ids=itemIdList.toString().drop(1).dropLast(1)//ids=“1,2,3”
itemViewModel.deleteByIds(ids)
}

当只有一个ID时,代码就起作用了。但是当有多个ID时,它不会。那么这里发生了什么?感谢您的帮助。

在处理
WHERE IN
子句时,您需要传递一个数组或列表。比如:

@Dao
interface ItemDao {
    @Query("DELETE FROM Item WHERE id IN (:ids)")
    fun deleteItemByIds(ids: Array<Long>)
}
@Dao
接口项DAO{
@查询(“从id位于(:ids)中的项目中删除”)
趣味deleteItemByIds(ID:Array)
}

我知道这个问题要求删除带有ID列表的行,但当我通过10k+ID时,我的应用程序崩溃。 因此,我尝试传递对象本身,它对我有效

@Dao
interface ItemDao {

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

}
@Dao
接口项DAO{
@删除
fun deleteUserByList(用户列表:数组)
}
通过这种方式,我可以删除超过10k行


以防任何人需要它。

我将类型更改为
Array
,因为id类型是
Long
,并且可以工作。非常感谢@不客气。如果有人需要,请随时用您的工作代码更新答案。您能告诉我该列表的最大长度是多少,或者我在哪里可以找到有关该列表的信息,有没有提到限制的文档?我收到一个错误。@Vijay限制是在
sqlite.c
文件中硬编码的,了解详细信息。您应该做的是将数组或列表拆分为低于限制的小块,并多次执行查询以实现完全删除。现在,我不是传递ID的ArrayList,而是传递对象本身的ArrayList,然后使用简单的@Delete对其进行注释。这对我来说甚至超过10k的删除都有效。谢谢。基本上,我同意你的看法。但概念是一样的。