我的表包含7条记录。使用update方法,我想更新具有INTEGER值的列。 使用for循环,我想用一系列数字更新所有记录,但它似乎无法正常工作,因为所有记录都使用循环的最后一个更新(7)。也许错误发生在WHERE子句中?谢谢你的建议。
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 :(得分:3)
问题在于你的whereClause。
read
表示它将更新所有不等于当前i值的记录(在这种情况下,它会将所有记录更新为值i)。
修改强>
MyTable.NUMERAZIONE + "!="+i
每次都会更新所有行,因此它不是解决方案。
我不是sqlite的专家,但其中一个解决方案是获取所有行,遍历它,设置new i值并在db上更新。
答案 1 :(得分:0)
考虑通过调用update()
运行的SQL。让我们进行第一次迭代(i = 1):
UPDATE table_name SET numerazione = 1 WHERE numerazione != 1
numerazione
不为1的任何行都将其设置为1,因此结果是每行都有numerazione
= 1.现在我们运行下一次迭代(i = 2):< / p>
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);
这应该产生以下声明:
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)