android SQLite 批量插入數據慢的解決方案 (針對於不一樣的android api 版本)

原地址 :http://www.cnblogs.com/wangmars/p/3914090.html html

 

  SQLite,是一款輕型的數據庫,被普遍的運用到不少嵌入式的產品中,由於佔用的資源很是少,二其中的操做方式幾乎和咱們接觸的數據庫很少,甚至只有幾百K的他天然會被需求者青睞,下面講一下在這樣的輕型數據庫中怎麼對他進行一些讀寫操做。android

  以前作選擇聯繫人的時候出現若是一個手機裏聯繫人超過2000的話,往數據庫裏面插入會很是耗時,不一樣的手機存儲的條數不一樣,這個存儲的數量和手機的內存有很大的關係,每每取決於手機內存,下面對於數據量大的狀況來寫一下sqlite的批量查詢。sql

  SqLite 插入數據有幾種
數據庫

  第一種 :因爲InsertHelper 這個類在android api17已經被廢棄了,因此要是基於 以前開發的可使用api

 

複製代碼
InsertHelper ih = new InsertHelper(db, "表名");
db.beginTransaction();
final int 列1= ih.getColumnIndex("列1");
final int 列2 = ih.getColumnIndex("列2");
try {
for (Station s : busLines) {
ih.prepareForInsert();
ih.bind(列1, 對應的值);
ih.bind(列2, 對應的值);
ih.execute();
}
db.setTransactionSuccessful();
} finally {
ih.close();
db.endTransaction();
db.close();
}
複製代碼

 

 

第二種 :spa

  一樣在 SQLiteDatabase 中 3d

複製代碼
public void inertOrUpdateDateBatch(List<String> sqls) {
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
try {
for (String sql : sqls) {
   db.execSQL(sql);
}
// 設置事務標誌爲成功,當結束事務時就會提交事務db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 結束事務db.endTransaction();
db.close();
}
}
複製代碼

 

 

第三種:SQLiteDatabase  db.insert("table_name", null, contentValues) 中也能夠批量插入code

複製代碼
public void insertData(插入數據){
db.beginTransaction(); // 手動設置開始事務for (ContentValues v : list) {
db.insert("表名", null, v);
}
db.setTransactionSuccessful(); // 設置事務處理成功,不設置會自動回滾不提交
db.endTransaction(); // 處理完成db.close()
}
複製代碼

 

   

第四種 :  SQLiteStatement  我的比較喜歡用這種方式,對數據的處理看的很清楚明瞭orm

複製代碼
String sql = "insert into表名(對應的列) values(?)";
SQLiteStatement stat = db.compileStatement(sql);
db.beginTransaction();
for (數據集) {
  //循環所要插入的數據
}
db.setTransactionSuccessful();
db.endTransaction();
db.close();
複製代碼

 

 

 

總結: 以上的幾種方式都用到了數據庫中的事務這個東西,sqlite語句在其中只會走一次,其餘的就是數據循環到數據庫中的對象裏,這樣比之前用對象插入,再用for在外圍循環快的不知道多少倍,以前插入2000多條數據300多毫秒,之後對於上萬條數據也是很是之快的。sqlite


來源:http://www.cnblogs.com/wangmars/p/3914090.html



相關文章
相關標籤/搜索