RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.
Введение в интерфейс SQLite C/C++

1. Обзор

Следующие два объекта и восемь методов включают существенные элементы интерфейса SQLite:

2. Введение

У SQLite есть больше 225 API. Однако большая часть API дополнительная и очень специализированная и может быть проигнорирована новичками. Основной API маленький, простой и легкий в изучении. Эта статья суммирует основной API.

Отдельный документ, интерфейс SQLite C/C++, предоставляет подробные спецификации для всего C/C++ API для SQLite. Как только читатель понимает основные принципы операций с SQLite, этот документ должен использоваться в качестве справочника. Эта статья предназначается только как введение и не является полным описанием для API SQLite.

3. Объекты и интерфейсы ядра

Основная задача базы данных SQL состоит в том, чтобы оценить SQL-операторы SQL. Чтобы достигнуть этого, разработчику нужны два объекта:

Строго говоря, объект подготовленного запроса не требуется, так как интерфейсы обертки sqlite3_exec или sqlite3_get_table могут использоваться, и эти обертки заключают в капсулу и скрывают объект подготовленного запроса. Тем не менее, понимание подготовленного запроса необходимо, чтобы полностью использовать SQLite.

Соединением с базой данных и подготовленными запросами управляет маленький набор функций упомянутого ниже интерфейса C/C++.

Обратите внимание на то, что список функций выше концептуальный, а не фактический. Многие из этого списка имеют несколько версий. Например, список выше показывает единственную функцию sqlite3_open(), когда на самом деле есть три отдельных, которые достигают того же самого немного отличающимися способами: sqlite3_open(), sqlite3_open16() и sqlite3_open_v2(). Список упоминает sqlite3_column(), когда на самом деле никакой такой функции не существует. "sqlite3_column()" в списке это заполнитель для всего множества функций, которые извлекают данные о колонке в различных типах данных.

Вот резюме того, что делают основные интерфейсы:

4. Типичное применение объектов ядра

Приложение будет, как правило, использовать sqlite3_open(), чтобы создать связь базы данных во время инициализации. Обратите внимание на то, что sqlite3_open() может использоваться, чтобы открыть существующие файлы базы данных или создать и открыть новые файлы базы данных. В то время как много запросов используют только одну связь базы данных, нет никакой причины, почему приложение не может вызвать sqlite3_open() много раз, чтобы открыть много соединений для той же самой базы данных или для различных баз данных. Иногда многопоточное приложение будет создавать отдельные соединения для каждого потока. Обратите внимание на то, что связь может получить доступ к двум или больше базам данных, используя команду SQL ATTACH, таким образом, нет необходимости иметь отдельное соединение с базой данных для каждого файла базы данных.

Много запросов закрывают соединение через sqlite3_close(). Или, например, приложение, которое использует SQLite в качестве формата файла приложения могло бы открыть связь в ответ на действие в меню File/Open и затем разрушить соответствующее соединение с базой данных в ответ на File/Close.

Чтобы управлять SQL-оператором, приложение выполняет эти шаги:

  1. Создать подготовленный запрос через sqlite3_prepare().
  2. Оценить подготовленный запрос через sqlite3_step() один или много раз.
  3. Для запросов извлечь результаты через sqlite3_column() между вызовами sqlite3_step().
  4. Разрушить подготовленный запрос через sqlite3_finalize().

Предшествующее является всем, что действительно нужно знать, чтобы использовать SQLite эффективно. Все остальное это оптимизация и детали.

5. Обертки удобства вокруг ядра

sqlite3_exec() это обертка удобства, которая выполняет все четыре вышеупомянутых шага единственным вызовом функции. Функция обратного вызова, переданная в sqlite3_exec(), используется, чтобы обработать каждую строку набора результатов. sqlite3_get_table() является другой оберткой удобства, которая делает все четыре из вышеупомянутых шагов. sqlite3_get_table() отличается от sqlite3_exec() тем, что это хранит результаты запросов в памяти кучи вместо того, чтобы вызвать отзыв.

Важно понять, что sqlite3_exec() или sqlite3_get_table() не делают что-либо, что не может быть достигнуто, используя ядро. На самом деле эти обертки осуществляются просто с точки зрения ядра.

6. Привязка параметров и подготовленные запросы

В предшествующем обсуждении предполагалось, что каждый SQL-оператор подготовлен однажды, оценен, затем разрушен. Однако, SQLite позволяет тому же самому подготовленному запросу быть оцененным многократно. Это достигается, используя следующий установленный порядок:

После того, как подготовленный запрос был оценен одним или более вызовами sqlite3_step() , это может быть перезагружено, чтобы быть оцененным снова, через sqlite3_reset(). Думайте о sqlite3_reset() как о перемотке программы подготовленного запроса на начало. Используя sqlite3_reset() на существующем подготовленном запросе вместо того, чтобы создать новый подготовленный запрос избегает ненужных обращений к sqlite3_prepare(). Для многих SQL-операторов время на выполнение sqlite3_prepare() равняется или превышает время, необходимое sqlite3_step(). Значит такой подход может дать значительное повышение производительности.

Обычно вряд ли полезно оценить тот же самый SQL-оператор несколько раз. Чаще надо оценить подобные запросы. Например, вы могли бы хотеть оценить оператор INSERT многократно с различными значениями. Или вы могли бы хотеть оценить тот же самый запрос, многократно используя различный ключ в операторе Where. Чтобы реализовать это, SQLite позволяет SQL-операторам содержать параметры, которые "связаны" со значением до оценки. Они могут позже быть изменены, и тот же самый подготовленный запрос может быть оценен во второй раз, используя новые значения.

SQLite позволяет параметры везде, где строковый литерал, blob, числовая константа или NULL позволен в запросах модификации данных или запросах (DQL или DML). Параметры не могут использоваться для имен столбцов или имен таблиц, как значения для ограничений или значений по умолчанию (DDL). Параметр принимает одну из следующих форм:

  • ?
  • ?NNN
  • :AAA
  • $AAA
  • @AAA

В примерах выше NNN это целочисленное значение, AAA это идентификатор. У параметра первоначально есть значение NULL. До запроса sqlite3_step() впервые или немедленно после sqlite3_reset() приложение может вызвать sqlite3_bind(), чтобы присоединить значение к параметрам. Каждый вызов sqlite3_bind() отвергает предшествующие привязки на том же самом параметре.

Приложению позволяют подготовить многократные SQL-операторы заранее и оценить их по мере необходимости. Нет никакого произвольного предела количеству выдающихся подготовленных запросов. Некоторые запросы вызывают sqlite3_prepare() многократно при запуске, чтобы создать все подготовленные запросы, в которых они будут когда-либо нуждаться. Другие запросы держат кэш последний раз используемых подготовленных запросов и затем повторно используют их, когда доступно. Другой подход должен снова использовать подготовленные запросы только, когда они в цикле.

7. Настройка SQLite

Конфигурация по умолчанию для SQLite работает отлично для большинства запросов. Но иногда разработчики хотят подправить установку, чтобы попытаться отжать немного больше работы или использовать в своих интересах некоторую неясную особенность.

sqlite3_config() используется, чтобы сделать глобальные изменения конфигурации всего процесса для SQLite. sqlite3_config() нужно вызвать, прежде чем любые соединения с базой данных создаются. sqlite3_config() позволяет программисту делать такие вещи, как:

  • Определить, как SQLite делает выделение памяти, включая подготовку альтернативных распределителей памяти, подходящих для критических по отношению к безопасности встроенных систем реального времени и определенных применением распределителей памяти.
  • Настройте журнал ошибок всего процесса.
  • Определите определенный применением кэш страницы.
  • Приспособьте использование mutexes так, чтобы они подходили для различных моделей потоков или заменили определенной применением системой mutex.

После того, как конфигурация всего процесса готова и соединения с базой данных были созданы, отдельные соединения с базой данных могут формироваться, используя sqlite3_limit() и sqlite3_db_config().

8. Расширение SQLite

SQLite включает интерфейсы, которые могут использоваться, чтобы расширить его функциональность. Такой установленный порядок включает:

sqlite3_create_collation() используется, чтобы создать новые последовательности сопоставления для сортировки текста. sqlite3_create_module() используется, чтобы зарегистрировать новые виртуальные таблицы. sqlite3_vfs_register() создает новый VFS.

sqlite3_create_function() создает новые функции SQL, скалярные или совокупности. Новая реализация функции, как правило, использует следующие дополнительные интерфейсы:

Все встроенные функции SQL SQLite создаются, используя точно эти те же самые интерфейсы. Обратитесь к исходному коду SQLite, в особенности к исходным файлам date.c и func.c для примеров.

Общие библиотеки или DLL могут использоваться в качестве загружаемых расширений SQLite.

9. Другие интерфейсы

Эта статья только упоминает самые важные и обычно используемые интерфейсы SQLite. Библиотека SQLite включает многих других API, реализующих полезные опции, которые не описаны здесь. Полный список функций, которые формируют прикладной программный интерфейс SQLite, есть здесь. Обратитесь к тому документу для полной и достоверной информации обо всех интерфейсах SQLite.