2015-07-10 72 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

好吧,我会找到另一个解决方案,谢谢 –