Android 更新所有记录 SQLite
Android update all records SQLite
我的 table 包含 7 条记录。使用更新方法,我想更新具有 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条,我想更新所有记录,没有任何子句。
问题出在您的 whereClause 上。
MyTable.NUMERAZIONE + "!="+i
意味着它将更新所有不等于当前 i 值的记录(在这种情况下它将更新所有记录为值 i)。
编辑
datab.update(MyTable.TABLE_NAME, cv, null, null);
每次都会更新所有行,所以这不是解决方案。
我不是 sqlite 专家,但解决方案之一是获取所有行,遍历它,设置新的 i 值并更新数据库。
考虑 SQL,您调用 update()
后将成为 运行。让我们进行第一次迭代 (i = 1):
UPDATE table_name SET numerazione = 1 WHERE numerazione != 1
任何 numerazione
不为 1 的行都会将其设置为 1,因此结果是每一行都有 numerazione
= 1。现在我们 运行 下一次迭代 (我 = 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);
这应该导致以下语句:
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)
我的 table 包含 7 条记录。使用更新方法,我想更新具有 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条,我想更新所有记录,没有任何子句。
问题出在您的 whereClause 上。
MyTable.NUMERAZIONE + "!="+i
意味着它将更新所有不等于当前 i 值的记录(在这种情况下它将更新所有记录为值 i)。
编辑
datab.update(MyTable.TABLE_NAME, cv, null, null);
每次都会更新所有行,所以这不是解决方案。
我不是 sqlite 专家,但解决方案之一是获取所有行,遍历它,设置新的 i 值并更新数据库。
考虑 SQL,您调用 update()
后将成为 运行。让我们进行第一次迭代 (i = 1):
UPDATE table_name SET numerazione = 1 WHERE numerazione != 1
任何 numerazione
不为 1 的行都会将其设置为 1,因此结果是每一行都有 numerazione
= 1。现在我们 运行 下一次迭代 (我 = 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);
这应该导致以下语句:
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)