2016-04-21 79 views
2

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

什么是造成这种缓慢的行为,我该如何解决它?

正常删除方法
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(); 
} 
+2

使用'beginTransaction()','setTransactionSuccessful()'和'endTransaction()'在事务中包装整个'execSQL()'调用循环。 – CommonsWare

+1

在第一个,为什么不断打开/关闭数据库?这就像是通过开店,购买牛奶,开车回家,放牛奶,开车回店铺,买面包,开车回家等来实现你的杂货店购物清单。 –

+0

@CommonsWare:我会试试这个。你能解释为什么这会有帮助吗? MarcB:因为这是我用来删除单行的方法,它从来没有被设计用于删除多行,我只是试着快速实现。 – Timmiej93

回答

3

作为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(); 
} 
+0

工程就像一个魅力。无论是你还是@CommonsWare都可以解释为什么这样做比以前更快? – Timmiej93

+1

提交操作时保存的开销时间。使用事务只执行一个提交操作。 – USKMobility

+1

@ Timmiej93:每个数据库事务涉及磁盘I/O。默认情况下,每个SQL语句都在它自己的事务中。所以,通过这个代码,你可以从N个事务移动到一个事务。做一次大型交易比许多小型交易要便宜得多。 – CommonsWare

相关问题