Подтвердить что ты не робот

Почему для удаления rawQuery требуется moveToFirst для фактического удаления строк?

Я много часов пытался отлаживать, почему следующий запрос на удаление фактически ничего не удалял, даже если точно такой же запрос в той же самой базе данных отлично работал в 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 в отношении подзапросов, поэтому я попытался упростить запрос. Но все равно ничего не удаляло.

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

или SQLiteStatement:

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

Ответ 3

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

Ответ 4

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