Какая разница между использованием rawquery и execSQL? При написании запроса в активности Android, когда использовать rawquery и когда использовать execSQL?
Из документации API:
Выполните один оператор SQL, который НЕ является SELECT или каким-либо другим оператором SQL, который возвращает данные.
void execSQL (String sql, Object[] bindArgs)
Выполните один оператор SQL, который НЕ является SELECT/INSERT/UPDATE/DELETE.
Документация несовместима, но они ведут себя одинаково. Документация последнего более подробно.
Cursor rawQuery (String sql, String[] selectionArgs)
Запускает предоставленный SQL и возвращает курсор по результирующему набору.
Использование для rawQuery
:
SELECT
. rawQuery("SELECT ...
возвращает набор строк и столбцов в Cursor
.
DatabaseUtils.longForQuery(SQLiteDatabase, String, String[])
или DatabaseUtils.stringForQuery(...)
в случаях, когда есть только результат запроса 1x1, как из SELECT count(*) FROM table
(у которого также есть собственный выделенный метод: DatabaseUtils.queryNumEntries(...)
) - это пропускает создание объекта Cursor
и упрощает код, поскольку также нечего закрывать, moveToNext и т.д.PRAGMA table_info
, который возвращает данные в строках (см. этот вопрос)rawQuery
для INSERT
, UPDATE
или DELETE
или что-либо еще, что изменяет базу данных. Вы столкнетесь с Почему для удаления rawQuery требуется moveToFirst для фактического удаления строк?. Причина в том, что запросы могут отложить чтение результата до тех пор, пока не понадобится (= доступ к курсору), что означает, что SQLite затягивает выполнение инструкции.Использование для execSQL
:
CREATE TABLE
(или любой другой оператор CREATE
, например CREATE INDEX
)), DROP
, PRAGMA
, который задает свойства, а не возвращает их,...INSERT
, UPDATE
или DELETE
, когда вас не интересует количество измененных строк или идентификатор строки последней вставки.
update()
, insert()
, delete()
или используйте второй оператор, чтобы прочитать их: DatabaseUtils.longForQuery
с помощью SELECT last_insert_rowid()
или SELECT changes()
. Оба возвращают только одно целочисленное значение. (см. Получить обновленные строки строк из SQLite на Android с использованием необработанного запроса? и "SELECT last_insert_rowid()" всегда возвращается "0" )если вы хотите что-то выполнить в базе данных без его вывода (например, создать/изменить таблицы), используйте execSQL, но если вы ожидаете некоторых результатов в ответ на ваш запрос (например, выберите записи), затем используйте rawQuery