**раздел таблицы**
db.execSQL("CREATE TABLE IF NOT EXISTS section (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT (255) NOT NULL, image TEXT (20) NOT NULL)");
Я хочу поменять местами две строки одной таблицы в базе данных sqlite
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL( "UPDATE section as s1 INNER JOIN section as s2 ON (s1.id, s2.id) IN (("+fromPosition+","+toPosition+"),("+toPosition+","+fromPosition+")) SET s1.title=s2.title, s1.image=s2.image");
ошибка
SQLiteException: near “as”: ошибка синтаксиса (Sqlite код 1 SQLITE_ERROR): , во время компиляции: UPDATE section as s1 INNER JOIN section as s2 ON (s1.id, s2.id) IN ((6,7),(7,6)) SET s1.title=s2.title, s1.image=s2.image, (ошибка ОС – 0:Успех)
Ответ
Чтобы решить ошибку синтаксиса SQLite в вашем коде Android Studio, давайте анализировать ваш запрос и предложим корректное решение.
Ваша текущая попытка обновления строк выглядит следующим образом:
db.execSQL("UPDATE section as s1 inner join section as s2 on (s1.id, s2.id) in (("+fromPosition+","+toPosition+"),("+toPosition+","+fromPosition+")) set s1.title=s2.title, s1.image=s2.image");
В SQLite не поддерживается синтаксис JOIN
в операторах UPDATE
, как это делается в других диалектах SQL (например, в MySQL). Вместо этого вы можете использовать подзапросы для достижения той же цели.
Правильный запрос:
Если вы хотите обменять значения двух строк в таблице section
с идентификаторами fromPosition
и toPosition
, вы можете сделать это следующим образом:
SQLiteDatabase db = this.getWritableDatabase();
// Сначала сохраним текущие значения для отнимаемой строки
Cursor cursor = db.rawQuery("SELECT title, image FROM section WHERE id = ?", new String[]{String.valueOf(fromPosition)});
String fromTitle = null;
String fromImage = null;
if (cursor.moveToFirst()) {
fromTitle = cursor.getString(0);
fromImage = cursor.getString(1);
}
cursor.close();
// Теперь обновим строку, которая имеет toPosition
db.execSQL("UPDATE section SET title = ?, image = ? WHERE id = ?", new Object[]{fromTitle, fromImage, toPosition});
// Теперь обновим строку, которая имеет fromPosition
cursor = db.rawQuery("SELECT title, image FROM section WHERE id = ?", new String[]{String.valueOf(toPosition)});
String toTitle = null;
String toImage = null;
if (cursor.moveToFirst()) {
toTitle = cursor.getString(0);
toImage = cursor.getString(1);
}
cursor.close();
// И последнее обновим строку с fromPosition
db.execSQL("UPDATE section SET title = ?, image = ? WHERE id = ?", new Object[]{toTitle, toImage, fromPosition});
Объяснение:
-
Сохранение значений: Сначала мы берем значения
title
иimage
для строки сfromPosition
. -
Обновление второй строки: Затем мы обновляем строку с
toPosition
, устанавливая ей значенияtitle
иimage
, которые мы ранее получили изfromPosition
. - Второе обновление первой строки: Наконец, мы обновляем строку с
fromPosition
, устанавливая ей значения изtoPosition
.
Вывод:
Такой подход позволит вам корректно обменивать значения двух строк в вашей таблице section
. Не забудьте обработать возможные исключения и проверить наличие данных в курсоре, чтобы избежать NullPointerException
.
Надеюсь, это поможет вам решить вашу проблему!