【问题标题】:With android Room, how to delete items more than 1000?使用android Room,如何删除1000多个项目?
【发布时间】:2019-09-03 12:57:09
【问题描述】:

当 id 大于 999 时发生崩溃

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

看到this 似乎有最大限制为 999。

如何删除超过1000的房间?

【问题讨论】:

    标签: sql sqlite android-room


    【解决方案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;
      }
    }
    

    希望对你有所帮助。

    【讨论】:

    • 我修改了答案并放了官方文档的链接。我会尽量找一些好的例子给你看。
    【解决方案2】:

    我认为有两种方法可以解决。

    首先,剁碎你的列表并使用 delete 方法运行多次。 (就像@xcesco 回答的那样)

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

    @RawQuery
    abstract int simpleRawQuery(SupportSQLiteQuery sqliteQuery)
    
    @Transaction
    public int deleteData(List<Long> pkList) {
       SimpleSQLiteQuery query = new SimpleSQLiteQuery("DELETE FROM tb WHERE _id IN (" + StringUtils.join(pkList,",") + ")";
       return simpleRawQuery(query) 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 2017-03-12
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多