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