Почему для удаления rawQuery требуется moveToFirst, чтобы фактически удалить строки? - PullRequest
23 голосов
/ 27 августа 2011

Я часами пытался отладить, почему следующий запрос на удаление фактически ничего не удалил, даже если точно такой же запрос к той же самой базе данных работал нормально в Firefox 'SQLite Manager:

String deleteSql = "DELETE FROM showsummary WHERE url IN (SELECT url FROM showsummary JOIN article_categories USING (url) WHERE categoryid=20 AND title LIKE 'page=%')";
mDb.rawQuery(deleteSql, null);

Так как и с JOIN, и с подзапросом это немного сложно, мои мысли обвились вокруг некоторых ограничений в реализации sqlite для Android относительно подзапросов, поэтому я попытался упростить запрос. Но все равно ничего не удалилось.

Затем я изменил его на запрос выбора (просто заменил DELETE на SELECT *), и это сработало. Так что, вероятно, виновником было не соединение или подзапрос.

Чтобы протестировать запрос на выборку, я добавил moveToFirst() к возвращенному курсору:

mDb.rawQuery(deleteSql, null).moveToFirst();

Когда позже я снова изменил его на запрос на удаление, я забыл удалить moveToFirst() , и тогда он заработал!

Приятно, что теперь это работает, но я очень растерялся, почему необходимо перемещать курсор, чтобы что-то действительно удалить. Это по замыслу или это ошибка?

Ответы [ 4 ]

12 голосов
/ 03 сентября 2011

Я не могу ответить на вопрос, почему, но другое решение - использовать .execSQL (String), как указано здесь

5 голосов
/ 27 августа 2011

rawQuery возвращает курсор набора результатов, который является просто ссылкой на результаты запроса. Вы должны просто использовать прямой вызов delete (). Посмотрите документацию:

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

или SQLiteStatement:

http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html

4 голосов
/ 25 сентября 2011

В моем случае, то же самое произошло и для DELETE, он успешно запустился после вызова «cursor.moveToFirst ()».То же самое относится и к запросам INSERT и UPDATE.Я также заметил, что при вызове любого метода на курсор для вышеупомянутых запросов я получил результаты правильно.Без вызова какого-либо метода курсора желаемый эффект имеет место.Итак, я думаю, что ответ на ваш вопрос таков: запрос выполняется только тогда, когда мы вызываем некоторый метод для курсора.

3 голосов
/ 05 марта 2013

Ответ почему, потому что rawQuery на самом деле не выполняется, пока вы не вызовете какой-либо метод для возвращаемого курсора. moveToFirst, isAfterLast ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...