【问题标题】:Removeing from SQLite database takes a long time, causing hangs从 SQLite 数据库中删除需要很长时间,导致挂起
【发布时间】:2016-04-22 02:17:50
【问题描述】:

我在我的应用程序中使用 SQLite 数据库。对于特定操作,我想删除特定表中的多个(可能相当多,最多大约一百个)条目。我已经尝试通过在for 循环中根据需要多次调用deleteStuffLink() 并在deleteStuffLink() 方法中添加循环来做到这一点。这两种方式都导致只有 15 件物品在 3 秒内挂起。

是什么导致了这种缓慢的行为,我该如何解决?

普通删除方法
for (String s : nameArray) { deleteStuffLink(s); }

public void deleteStuffLink(String name) {
    SQLiteDatabase db;
    db = getWritableDatabase();
    db.execSQL("DELETE FROM " + TABLE_LinkTable 
        + " WHERE " + LT_COLUMN_NAME + "=\"" + name + "\";");
    db.close();
}

包含循环

public void deleteAllStuffLink(ArrayList<String> nameArray) {
    SQLiteDatabase db;
    db = getWritableDatabase();
    for (String s : nameArray) {
        db.execSQL("DELETE FROM " + TABLE_LinkTable 
            + " WHERE " + LT_COLUMN_NAME + "=\"" + s + "\";");
    }
    db.close();
}

【问题讨论】:

  • 使用 beginTransaction()setTransactionSuccessful()endTransaction() 将整个 execSQL() 调用循环包装在事务中。
  • 在第一个中,为什么不断地打开/关闭数据库?这就像通过开车去商店、买牛奶、开车回家、送牛奶、开车回商店、买面包、开车回家等来完成你的杂货购物清单......
  • @CommonsWare:我要试试。你能解释一下为什么这会有所帮助吗? MarcB:因为这也是我用来删除单行的方法,所以它从来都不是为删除多行而设计的,我只是在运行中尝试了一个快速的实现。

标签: android android-sqlite sqliteopenhelper


【解决方案1】:

作为 CommonsWare 的评论,

public void deleteAllStuffLink(ArrayList<String> nameArray) {
    SQLiteDatabase db;
    db = getWritableDatabase();
   db.beginTransaction();
    for (String s : nameArray) {
        db.execSQL("DELETE FROM " + TABLE_LinkTable 
            + " WHERE " + LT_COLUMN_NAME + "=\"" + s + "\";");
    }
   db.setTransactionSuccessful();
   db.endTransaction();
    db.close();
}

【讨论】:

  • 像魅力一样工作。您或@CommonsWare 能否解释一下为什么这比我以前做的要快得多?
  • 提交操作中节省的开销时间。使用事务只执行了一次提交操作。
  • @Timmiej93:每个数据库事务都涉及磁盘 I/O。默认情况下,每个 SQL 语句都在其自己的事务中。因此,使用此代码,您可以从 N 个事务转移到一个事务。做一笔大交易比做很多小交易要便宜得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2015-03-31
  • 2011-02-07
相关资源
最近更新 更多