2 ответов:
Из документации 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или что-нибудь еще, что изменяет базу данных. Вы столкнетесь с "зачем delete rawQuery нужен moveToFirst, чтобы на самом деле удалить строки?". Причина в том, что запросы могут отложить чтение результата до необходимости (= доступ к курсору), что означает для SQLite задержкувыполнения оператора .Использует для
execSQL:
- у вас есть "инструкции" для базы данных. Как
CREATE TABLE(или любое другоеCREATEутверждение, напримерCREATE INDEX),DROP,PRAGMAs, которые задают свойства, а не возвращают их, ...INSERT,UPDATEилиDELETE, когда вас не интересует количество измененных строк или идентификатор последней строки вставлять.
- когда они вам понадобятся, либо используйте
update(),insert(),delete()методы или используйте второе утверждение, чтобы прочитать их:DatabaseUtils.longForQueryлибоSELECT last_insert_rowid(), либоSELECT changes(). Возвращают только 1 целое число. (см. " получить обновленное количество строк из SQLite в Android с помощью необработанного запроса?" и " SELECT last_insert_rowid () " возвращает всегда "0")- все остальное, что зависит от выполнения оператора.
Если вы хотите выполнить что-то в базе данных, не касаясь ее выходных данных (например, создать / изменить таблицы), то используйте execSQL , но если вы ожидаете каких-то результатов в ответ на ваш запрос (например, выбрать записи), то используйте rawQuery
Comments