Какая разница между использованием 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