Android обновляет все записи SQLite

моя таблица содержит 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, я хочу обновить все записи без каких-либо оговорок.


person Debora Carnevali    schedule 10.07.2015    source источник
comment
AFAIK в SQL не равен <>, а не !=.   -  person m0skit0    schedule 10.07.2015


Ответы (2)


Рассмотрим SQL, который будет выполняться вашим вызовом update(). Возьмем первую итерацию (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 или какой-либо другой способ обновить ваши строки. Одним из решений является создание предложения WHERE с использованием оператора NOT IN и с каждым разом увеличения списка. У первого будет 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)
person Karakuri    schedule 10.07.2015
comment
Если предоставленный мной код поможет вам, возможно, стоит вместо этого отметить этот ответ. - person Karakuri; 11.07.2015

Проблема с вашим whereClause.

MyTable.NUMERAZIONE + "!="+i

означает, что он обновит все записи, которые не равны текущему значению i (в этом случае он обновит все записи до значения i).

ИЗМЕНИТЬ

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

также будет каждый раз обновлять все строки, так что это не решение.

Я не эксперт в sqlite, но одно из решений - извлечь все строки, перебрать их, установить новое значение i и обновить в БД.

person pjanecze    schedule 10.07.2015