我有超过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来确定你剩余的时间在哪里度过。

10-05 21:26