Sqlite之事務


 

12.Sqlite事務介紹:

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

 

 ==========

12.Sqlite事務介紹:

應用程序初始化時需要批量的向sqlite中插入大量數據,單獨的使用for+Insert方法導致應用響應緩慢,因為 sqlite插入數據的時候默認一條語句就是一個事務,有多少條數據就有多少次磁盤操作。我的應用初始5000條記錄也就是要5000次讀寫磁盤操作。
而且不能保證所有數據都能同時插入。(有可能部分插入成功,另外一部分失敗,后續還得刪除。太麻煩)

解決方法:添加事務處理,把5000條插入作為一個事務

我們使用SQLite的事務進行控制:
db.beginTransaction(); //手動設置開始事務
try{
//批量處理操作
for(Collection c:colls){
insert(db, c);
}
db.setTransactionSuccessful(); //設置事務處理成功,不設置會自動回滾不提交。
//在setTransactionSuccessful和endTransaction之間不進行任何數據庫操作
}catch(Exception e){
MyLog.printStackTraceString(e);
}finally{
db.endTransaction(); //處理完成
}

一、使用SQLiteDatabase的beginTransaction()方法可以開啟一個事務,程序執行到endTransaction() 方法時會檢查事務的標志是否為成功,
如果程序執行到endTransaction()之前調用了setTransactionSuccessful() 方法設置事務的標志為成功,
則所有從beginTransaction()開始的操作都會被提交,如果沒有調用setTransactionSuccessful()方法則回滾事務。

二、使用例子如下:下面兩條SQL語句在同一個事務中執行。

//銀行賬戶事務測試
public void payment()
{
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
//開啟事務
db.beginTransaction();
try
{
db.execSQL("update person set amount=amount-10 where personid=?", new Object[]{1});
db.execSQL("update person set amount=amount+10 where personid=?", new Object[]{2});
//設置事務標志為成功,當結束事務時就會提交事務
db.setTransactionSuccessful();
}
catch(Exception e){
throw(e);
}
finally
{
//結束事務
db.endTransaction();
}
}

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

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

  SQLite,是一款輕型的數據庫,被廣泛的運用到很多嵌入式的產品中,因為占用的資源非常少,二其中的操作方式幾乎和我們接觸的數據庫不多,甚至只有幾百K的他自然會被需求者青睞,下面講一下在這樣的輕型數據庫中怎么對他進行一些讀寫操作。

  之前做選擇聯系人的時候出現如果一個手機里聯系人超過2000的話,往數據庫里面插入會非常耗時,不同的手機存儲的條數不同,這個存儲的數量和手機的內存有很大的關系,往往取決於手機內存,下面對於數據量大的情況來寫一下sqlite的批量查詢。

  SqLite 插入數據有幾種

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

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();
}

第二種 :

  同樣在 SQLiteDatabase 中 

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) 中也可以批量插入

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

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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM