我有超过20000行的sqlite。
添加新数据(2000行)需要2秒。
但当我试图更新同样的2000行时,几乎需要10分钟。
我正在使用以下代码进行更新
public int update_ItemPriceDetails(Struct_ItemPrice_Details mStruct_ItemPrice_Details, String ItemId)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
//values.put(KEY_NAME, contact.getName());
values.put(Key_ITEM_Id, mStruct_ItemPrice_Details.get_Item_Id()); // Struct_Contact Name
values.put(Key_PRICE_Id, mStruct_ItemPrice_Details.get_Price_Id()); // Struct_Contact Name
.
.
.
// updating row
int update=db.update(TABLE, values,
Key_PRICE_Id + "=?",
new String[] {mStruct_ItemPrice_Details.get_Price_Id()});
// db.close();
return update;
}
Database_ItemPrice_Details db = getInstance(context);
SQLiteDatabase DB = db.getWritableDatabase();
try {
DB.beginTransaction();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i=0i<2000;i++)
{
update_ItemPriceDetails(List.get(i), "")
}
try {
Database_ItemPrice_Details_Kolkata db = getInstance(context);
SQLiteDatabase DB = db.getWritableDatabase();
DB.setTransactionSuccessful();
DB.endTransaction();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
最佳答案
步骤1:不要在循环内调用getWritableDatabase()
。在整个代码片段中应该只有一个调用getWritableDatabase()
。
步骤2:正确使用事务:
db.beginTransaction();
try {
// your SQL
db.markTransactionSuccessful();
}
catch (Exception e) {
// do whatever logging you want to do, etc.
}
finally {
db.endTransaction();
}
可能您所拥有的不会影响性能,但是由于正确的事务对性能非常重要,因此值得检查。特别是在您描述的持续时间内,感觉事务工作不正常。
步骤3:正如tobyll建议的那样,确保在java中用
Key_PRICE_Id
表示的列上有一个索引。步骤4:避免在循环内创建
ContentValues
,以避免创建过多的垃圾。第五步:使用traceview来确定你剩余的时间在哪里度过。