Какая разница между использованием rawquery и execSQL? При написании запроса в активности Android, когда использовать rawquery и когда использовать execSQL?
Разница между rawquery и execSQL в базе данных android sqlite
Ответ 1
Из документации 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" )
- Если вам это нужно, используйте методы
- Все, что полагается на выполнение инструкции.
Ответ 2
если вы хотите что-то выполнить в базе данных без его вывода (например, создать/изменить таблицы), используйте execSQL, но если вы ожидаете некоторых результатов в ответ на ваш запрос (например, выберите записи), затем используйте rawQuery