Ответ 1
Я не могу ответить, почему, но другое решение - использовать .execSQL(String), как опубликовал здесь
Я много часов пытался отлаживать, почему следующий запрос на удаление фактически ничего не удалял, даже если точно такой же запрос в той же самой базе данных отлично работал в 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()
, а затем он сработает!
Хорошо, что теперь это работает, но я очень смущен, почему нужно перемещать курсор, чтобы фактически удалить что-либо. Это по дизайну или это ошибка?
Я не могу ответить, почему, но другое решение - использовать .execSQL(String), как опубликовал здесь
rawQuery возвращает курсор результирующего набора, который является лишь ссылкой на результаты запроса. Вы должны просто использовать прямой вызов delete(). Взгляните на документацию:
http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html
или SQLiteStatement:
http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html
В моем случае также, то же самое произошло для DELETE, оно успешно сработало после вызова "cursor.moveToFirst()". То же самое происходит и с запросами INSERT и UPDATE. Я также заметил, что при вызове любого метода в курсоре для вышеупомянутых запросов у меня есть результаты правильно. Без вызова какого-либо метода курсора происходит желаемый эффект. Итак, я думаю, что ответ на ваш вопрос: запрос выполняется только тогда, когда мы вызываем какой-то метод на курсор.
Ответ почему-то потому, что rawQuery на самом деле не выполняется, если вы вызываете какой-либо метод на возвращенный курсор. moveToFirst, isAfterLast..