2013-10-12 39 views
0

我有一個目前執行速度很慢的android sqlite數據庫。如何使用android sqlite和contentvalue批量替換

每次我從做更新,如果未能插入程序只使用替代(這是相同的REPLACE INTO也被稱爲插入或更換)

我現在想從這樣一個變化而變化的Improve INSERT-per-second performance of SQLite?意見同時更換,以做上百同時

static ArrayList<ContentValues> cvs= new ArrayList<ContentSystem>(); 



_dh.BeginTransaction(Table); 
for(int i = 0; i < cvs.size(); ++i) 
{ 
replace(ma, cvs.get(i), dh, Table, Key); 
} 
_dh.EndTransaction(Table); 

到使用羣發系統

SQLiteStatement stmt = _dh.db.compileStatement("Replace into tablename(..) value (?,?)"); 
    _dh.BeginTransaction(Table); 
    for(int i = 0; i < cvs.size(); ++i) 
    { 
    stmt.bindString(cvs.get(i)); 
    } 
    stmt.execute(); 
    _dh.EndTransaction(Table); 

但我不underst和編譯的語句是什麼樣子 我也不明白,我會把在綁定字符串函數 - 我有存儲在contentvalue

從這個 http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html#execute()

同樣的數據,如果執行這個SQL語句,它不是一個SELECT /插入/刪除/ UPDATE,例如CREATE/DROP表,視圖,觸發器,索引等等

它出現在執行呼叫不會與替換工作嗎?因爲它在做插入/更新 這是正確的嗎?

這裏是我的數據庫是如何建立,如何我使用的替代呼叫 http://sqlfiddle.com/#!7/b8af8/1

+0

'dh'和'_dh'是否一樣?如果是的話,爲什麼有兩個對同一個數據庫的引用? –

+0

如何實現'Begin' /'EndTransaction'?爲什麼他們需要一個表參數? –

+0

dh,_dh同樣的事情,它的半僞代碼爲這個問題...開始和結束真的只是調用數據庫的實際功能,一些錯誤檢查和設置成功 - 只是沒有必要顯示手頭的問題 – morty346

回答

0

使用事先準備好的聲明不會有太大的性能差異的(使用事務正確更重要的),但如果你想使用它,你必須手動處理每一個參數,你必須調用一次execute每個記錄:

db.beginTransaction(); 
try { 
    SQLiteStatement stmt = db.compileStatement(
     "REPLACE INTO MyTable(x,y,z) VALUES(?,?,?)"); 
    for (int i = 0; i < cvs.size(); ++i) { 
     ContentValues cv = cvs.get(i); 
     stmt.bindString (1, cv.getAsString ("x")); 
     stmt.bindString (2, cv.getAsString ("y")); 
     stmt.bindInteger(3, cv.getAsInteger("z")); 
     stmt.execute(); 
    } 
    db.setTransactionSuccessful(); 
} finally { 
    db.endTransaction(); 
} 

差異化的executeexecuteInsert,而executeUpdateDelete只是在返回值中;如果您不需要,您可以使用execute作爲的任何聲明。

+0

感謝您的迴應!好奇你爲什麼說它不會有很大的區別?在這個線程 - http://stackoverflow.com/questions/1711631/how-do-i-improve-the-performance-of-sqlite - 他能夠採取只使用38秒到16秒的開始/結束交易 – morty346

+0

從9934減少到38更大...... –