Android更新所有记录SQLite

时间:2015-07-10 15:19:33

标签: android sqlite records

我的表包含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,我想更新所有记录,没有任何条款。

2 个答案:

答案 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)