使用Android Room,如何删除超过1000个的项目?

时间:2019-09-03 12:57:09

标签: sql sqlite android-room

当id> 999时崩溃

android.database.sqlite.SQLiteException: too many SQL variables (code 1): , 
while compiling: delete from data where ids in (?,?,...)

看到this的最大限制为999。

如何使用“会议室”删除1000多个?

2 个答案:

答案 0 :(得分:1)

可能您有要删除的ID列表。打开一个事务,在子列表中拆分列表,然后对子列表执行一次SQL删除操作。

有关Room的更多信息,请访问Transactions with Room的官方文档。

我没有测试以下代码,但我认为它可以满足您的需求。

@Dao
public interface DataDao {
    @Delete("delete from data where ids in :filterValues")
    long delete(List<String> filterValues)

    @Transaction
    public void deleteData(List<Data> dataToDelete) {
         // split the array in list of 100 elements (change as you prefer but < 999)
         List<List<Data>> subLists=DeleteHelper.chopped(dataToDelete, 100);
         List<String> ids=new ArrayList<>();

         for (List<Data> list: subList) {
           list.clear();
           for (Data item: list) {
              ids.add(item.getId());
           } 

           delete(ids);
         }

    }    
}

public abstract class DeleteHelper {
   // chops a list into non-view sublists of length L
   public static <T> List<List<T>> chopped(List<T> list, final int L) {
       List<List<T>> parts = new ArrayList<List<T>>();
       final int N = list.size();
       for (int i = 0; i < N; i += L) {
         parts.add(new ArrayList<T>(
            list.subList(i, Math.min(N, i + L)))
         );
    }
    return parts;
  }
}

我希望有帮助。

答案 1 :(得分:0)

我认为有两种解决方法。

首先,将您的列表切碎,并使用delete方法运行多次。 (就像@xcesco回答的一样)

第二,您可以编写很长的查询并使用@RawQuery运行它。

if self.__cache is None