Точнее говоря, я не могу сказать, что я вполне понимаю, как это работает:
Это может работать, как в обычном режиме, но, как объяснено ниже, вероятно, работаетничего бесполезного.
Метод SQLiteDatabase update
- это удобный способ выдачи SQL для выполнения обновления.Он записывает / создает базовый SQl, выполняет его, а также возвращает результат (количество обновленных строк).
Используя ваш код в качестве примера, выполните то же самое, не используя метод update
, который вы могли бысоздайте SQL: -
UPDATE Task SET TaskName = 'your_value' WHERE Task = 'your_value'
Обратите внимание, что это на самом деле бесполезно, поскольку вы фактически говорите (предполагая для демонстрации, что значение, переданное методу editTask, равно task001 ) * * один тысяча двадцать-одна; Обновление строк (-ов) задач, которые имеют / имеют значение task001 в столбце TaskName и должны быть изменены с task001 на task001 .
Обратите внимание, что метод update
использует UPDATE OR IGNORE......
, поэтому: -
- Когда происходит применимое нарушение ограничения, алгоритм разрешения IGNORE пропускает одну строку, содержащую нарушение ограничения, и продолжает обрабатывать последующие строки оператора SQL, как будто ничего не пошло не так.Другие строки до и после строки, содержащей нарушение ограничения, вставляются или обновляются нормально.Ошибка не возвращается при использовании алгоритма разрешения конфликтов IGNORE. SQL в понимании SQLite - ON ON CONFLICT
Предложение
Возможно, что было бы более полезным, если, скажем, вы хотите изменить строку, которая раньшеобновление имеет значение task001 .Изменив его, скажем, на task002 .
, в этом случае SQL может быть: -
UPDATE Task SET TaskName = 'your_new_value' WHERE Task = 'your_original_value'
Ваш метод editTask
может быть таким: -
public void editTask(String original_task, String new_task){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(DB_COLUMN,new_task);
db.update(DB_TABLE,values,DB_COLUMN + " = '" + original_task + "'" ,null) > 0;
db.close();
}
например, используя edittask("task001","task002");
Обратите внимание, как значение original_task заключено в одинарные кавычки.
Однако , рекомендуемый способ, будет использовать аргументы (которые будут автоматически заключены в кавычки), так что выше может быть: -
public void editTask(String original_task, String new_task){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(DB_COLUMN,new_task);
String[] whereargs = new String[]{original_task};
db.update(DB_TABLE,values,DB_COLUMN + "=?",whereargs) > 0;
db.close();
}
- каждый ? закодировано в WHERECLAUSE (3-й параметр), заменено соответствующим аргументом в WHEREARGS (4-й параметр) 1 к 1.
Дополнительно
В дополнение к созданию SQL, метод update
также вызывает SQL, используя соответствующие средства, например, он делает для вас эквивалент db.execSQL(your_sql)
.
Дополнительно в случае update
онзатем делает эквивалент: -
Cursor csr = db.rawQuery("SELECT total_changes()",null);
int total_changes = 0;
if(csr.moveToFirst()) {
total_changes = csr.getInt(0);
}
return total_changes;
Следовательно, возвращает количество обновленных строк.