2015-07-10 67 views
0

我的表包含7條記錄。使用更新方法,我想更新具有INTEGER值的列。 與一個for循環,我想用數字序列更新所有記錄,但它似乎無法正常工作,因爲所有記錄都用循環的最後一個更新(7)。也許錯誤在WHERE子句中?謝謝你的建議。Android更新所有記錄SQLite

SQLiteDatabase datab = new DatabaseHelper(getActivity()).getReadableDatabase(); 

ContentValues cv = new ContentValues(); 
for(int i = 1; i<8; i++){ 
    cv.put(MyTable.NUMERAZIONE, i); 
    datab.update(MyTable.TABLE_NAME, cv, MyTable.NUMERAZIONE + "!="+i, null); 
} 
datab.close(); 

我也試過沒有WHERE子句,但我得到了相同的結果:

datab.update(MyTable.TABLE_NAME, cv, null, null); 

記錄是7,我想更新的所有記錄,沒有任何條款。

+0

AFAIK 「不等於」 是'<>','未='。 – m0skit0

回答

0

考慮一下您的電話號碼update()將運行的SQL。讓我們第一次迭代(I = 1):

UPDATE table_name SET numerazione = 1 WHERE numerazione != 1 

任何行,其中numerazione不是1將其設爲1,這樣的結果是,每行都有numerazione = 1。現在我們運行下一次迭代(I = 2):

UPDATE table_name SET numerazione = 2 WHERE numerazione != 2 

任何行,其中numerazione不是2將其設置爲2,但上一次迭代後,所有行numerazione = 1,因此該語句將更新所有行。剩下的迭代也會發生同樣的情況,對於所有行,最後一個設置numerazione爲7。

您需要找到其他WHERE子句或其他方式來更新您的行。一種解決方案是使用NOT IN運算符構建WHERE子句,並且每次都增大列表的大小。第一個將有NOT IN (1),第二個將有NOT IN (1,2),依此類推。既然你只需要做很少的幾次,那對性能來說不會太壞。

private String buildWhere(int number) { 
    StringBuilder builder = new StringBuilder(MyTable.NUMERAZIONE).append("NOT IN (1"); 
    for (int i = 2; i <= number; i++) { 
     builder.append(',').append(i); 
    } 
    builder.append(')'); 
    return builder.toString(); 
} 
... 
datab.update(MyTable.TABLE_NAME, cv, buildWhere(i), null); 

這應導致下列語句:在SQL

UPDATE table_name SET numerazione = 1 WHERE numerazione NOT IN (1) 
UPDATE table_name SET numerazione = 2 WHERE numerazione NOT IN (1,2) 
... 
UPDATE table_name SET numerazione = 7 WHERE numerazione NOT IN (1,2,3,4,5,6) 
+0

如果我提供的代碼可以幫助你,也許考慮標記這個答案。 – Karakuri

3

問題在於你的whereClause。

MyTable.NUMERAZIONE + "!="+i 

意味着它將更新所有不等於當前i值的記錄(在這種情況下,它會將所有記錄更新爲值i)。

編輯

datab.update(MyTable.TABLE_NAME, cv, null, null); 

也將每一次更新所有行,所以它不是一個解決方案。

我不是sqlite的專家,但其中一個解決方案是獲取所有行,遍歷它,設置新的i值並在db上更新。

+0

我編輯了我的帖子,請看! –

+0

我也編輯 – pjanecze

+0

好吧,我會找到另一個解決方案,謝謝 –