2013-10-10 48 views
2

我一直在尋找這個網站一段時間,但還沒有找到答案。我正在嘗試對我已知的數據進行批量更新。當某個條件返回行ID時,我需要設置一列。這是單一的方法,但我想使它更高效,並將其作爲批量使用。我們的數據庫不在提供程序中,所以我只使用助手類。批量更新數據庫

public void markUnavailable(int myId) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    String sql = "UPDATE " + MYTABLE + " SET " + Col.IS_AVAILABLE + "= 0"+ " WHERE " + Col.MY_ID + "=" + myId; 
    db.execSQL(sql); 
    db.close(); 
} 

我想傳遞一個myIds數組來做批量更新。我無法執行插入或替換語句,因爲我無法訪問所有列數據,也不想因爲代碼更改太多而不能傳遞。

public void markUnavailable(int[] myId) { 
    // ???? 
    /// need some way to loop through and update in bulk 
} 

回答

8

嘗試UPDATE tablename SET column=0 WHERE ID IN (...),其中...是逗號分隔的ID值列表。

+0

這將需要將數組解析爲字符串,並且任意長度的數組可能會阻止SQL語句進行編譯。 –

+0

@LS_dev:然後爲每個例如10​​0個條目做一個「UPDATE」。 – CommonsWare

+0

需要更多解析。我不認爲這應該是一個正常的數據庫方法。 –

7

我不是一個Android開發者,但根據良好的數據庫的做法,你應該:

public void markUnavailable(int[] myId) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.beginTransaction(); 
    SQLiteStatement upd=db.compileStatement("UPDATE "+MYTABLE+" SET "+Col.IS_AVAILABLE+"=0 WHERE "+Col.MY_ID+"=?"; 
    for (int i = 0; i < myId.length; i++) { 
     upd.bindLong(1, myId[i]); 
     upd.execute(); 
    } 
    db.endTransaction(); 
} 

Android有SQLiteDatabase.update會在這種情況下非常有用,但String [] whereArgs不會與你int[] myId處理好。

2

執行批量更新的最快方法是通過使用開始和結束事務將其作爲單個事務執行。另外,如果數據庫的大小很大,將myID作爲表的主鍵是一個好主意,因爲當使用WHERE子句時,它將顯着提高獲取行的更新速度[It據說索引可以降低更新和插入的速度,但是當使用where子句時,索引一直以巨大的利潤率提高了我的速度。

public void markUnavailable(int[] myId) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.beginTransaction(); 
    SQLiteStatement upd=db.compileStatement("UPDATE "+MYTABLE+" SET "+Col.IS_AVAILABLE+"=0 WHERE "+Col.MY_ID+"=?"); 
    for (int i = 0; i < myId.length; i++) { 
     upd.clearBindings(); 
     upd.bindLong(1, myId[i]); // this matches the first "?" 
     upd.execute(); 
    } 
    db.setTransactionSucessful(); 
    db.endTransaction(); 
}