Intereting Posts
В чем разница между match_parent и fill_parent? Доля WiFi-настроек в виде QR-кода для WPA2 Enterprise Представления внутри пользовательской ViewGroup не отображаются после изменения размера Как найти владельца аккаунта для Android-приложения в консоли разработчика Google Play? Android TextView с полосами прокрутки и maxHeight Выберите несколько изображений из фотоальбома на Android с помощью намерений Как я могу получить размер холста пользовательского представления вне метода onDraw? Альтернативный setButton Поведение компоновщика нестандартного макета Активность не называлась финишем? (API 23) Asus Zenfone 5 не обнаружен компьютером Как исправить проблемы с поисковой панелью-большим пальцем Что такое `Authorization` часть запроса на отправку HTTP сообщения Firebase Downstream? Библиотеки Android с открытым исходным кодом? Многоразовые виды, ViewGroups, адаптеры и т. Д.? Установить уведомление из папки «Активы»

Разница между rawquery и execSQL в базе данных android sqlite

Какая разница между использованием rawquery и execSQL? При написании запроса в активности Android, когда использовать rawquery и когда использовать execSQL?

Solutions Collecting From Web of "Разница между rawquery и execSQL в базе данных android sqlite"

Из документации API:


void execSQL (String sql)

Выполните один оператор 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(...) в случаях, когда есть только результат запроса 1×1, например, из 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