![]() |
|
|||
WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Следующие два объекта и восемь методов включают существенные
элементы интерфейса SQLite: sqlite3 →
объект соединения с базой данных. Создан
sqlite3_open() и уничтожен
sqlite3_close(). sqlite3_stmt →
Объект подготовленого запроса. Создан
sqlite3_prepare() и разрушен
sqlite3_finalize(). sqlite3_open() →
Открывают связь с новой или существующей базой данных SQLite. Конструктор для
sqlite3. sqlite3_prepare() →
Собирает код на SQL в байт-код, который сделает работу с БД. Конструктор для
sqlite3_stmt. sqlite3_bind() →
Сохраняет данные в параметрах
SQL. sqlite3_step() →
Передвигает sqlite3_stmt на следующую строку
результата или к завершению. sqlite3_column() →
Значения столбцов в текущей строке результата для
sqlite3_stmt. sqlite3_finalize() →
Деструктор для sqlite3_stmt. sqlite3_close() →
Деструктор для sqlite3. sqlite3_exec() →
Функция обертки, которая делает
sqlite3_prepare(),
sqlite3_step(),
sqlite3_column() и
sqlite3_finalize()
для строки из одного или более SQL-операторов. У SQLite есть больше 225 API. Однако большая часть API дополнительная и
очень специализированная и может быть проигнорирована новичками.
Основной API маленький, простой и легкий в изучении.
Эта статья суммирует основной API. Отдельный документ, интерфейс SQLite C/C++,
предоставляет подробные спецификации для всего C/C++ API для SQLite.
Как только читатель понимает основные принципы операций с SQLite,
этот документ должен использоваться в качестве
справочника. Эта статья предназначается только как введение и не является
полным описанием для API SQLite. Основная задача базы данных SQL состоит в том, чтобы оценить SQL-операторы
SQL. Чтобы достигнуть этого, разработчику нужны два объекта: Строго говоря, объект подготовленного запроса
не требуется, так как интерфейсы обертки
sqlite3_exec или
sqlite3_get_table
могут использоваться, и эти обертки заключают в капсулу и скрывают
объект подготовленного запроса.
Тем не менее, понимание подготовленного запроса
необходимо, чтобы полностью использовать SQLite. Соединением с базой данных и
подготовленными запросами
управляет маленький набор функций упомянутого ниже интерфейса C/C++. Обратите внимание на то, что список функций
выше концептуальный, а не фактический. Многие из этого списка имеют
несколько версий. Например, список выше показывает единственную функцию
sqlite3_open(),
когда на самом деле есть три отдельных, которые достигают того же самого
немного отличающимися способами:
sqlite3_open(),
sqlite3_open16() и
sqlite3_open_v2().
Список упоминает sqlite3_column(),
когда на самом деле никакой такой функции не существует.
"sqlite3_column()" в списке это заполнитель для всего множества
функций, которые извлекают данные о колонке в различных типах данных. Вот резюме того, что делают основные интерфейсы: Открывает связь с файлом базы данных SQLite и возвращает объект
соединения с базой данных.
Это часто первый вызов API SQLite, который приложение делает и является
предпосылкой для большей части другого API SQLite. Много интерфейсов SQLite
требуют указателя на объект
соединения с базой данных
как их первый параметр и могут считаться методами на объекте
соединения с базой данных.
Это конструктор для объекта
соединения с базой данных. Это преобразовывает код на SQL в
подготовленный запрос и возвращает указатель на тот объект.
Этот интерфейс требует, чтобы был подготовлен указатель
соединения с базой данных, созданный
предшествующим вызовом sqlite3_open(),
и текстовая строка, содержащая SQL-оператор. Этот API на самом деле не
оценивает SQL-оператор. Это просто готовит SQL-оператор к оценке. Думайте о каждом SQL-операторе как о маленькой компьютерной
программе. Цель sqlite3_prepare()
состоит в том, чтобы собрать эту программу в объектный код.
Подготовленный запрос это объектный код.
sqlite3_step()
управляет объектным кодом, чтобы получить результат. Новые приложения должны всегда вызывать
sqlite3_prepare_v2() вместо
sqlite3_prepare().
Более старый sqlite3_prepare()
сохраняется для обратной совместимости. Но
sqlite3_prepare_v2()
обеспечивает намного лучший интерфейс. Это используется, чтобы оценить
подготовленный запрос, который был ранее создан
sqlite3_prepare().
Запрос оценен до пункта, где первая строка результатов доступна.
Чтобы продвинуться к второй строке результатов, вызовите
sqlite3_step() снова.
Продолжите вызывать sqlite3_step()
до выполнения запроса. Запросы, которые не возвращают результаты (исключая:
INSERT, UPDATE или DELETE) переходят к завершению на единственном вызове
sqlite3_step(). Это возвращает отдельный столбец из текущей строки набора результатов для
подготовленного запроса, который оценивается
sqlite3_step(). Каждый раз
sqlite3_step() останавливается с новой строкой
набора результатов, это можно вызвать многократно, чтобы найти значения
всех колонок в строке. Как отмечено выше, действительно нет такой вещи как функция
"sqlite3_column()" в SQLite API. То, что здесь мы называем
"sqlite3_column()", это заполнитель для всех
функций, которые возвращают значение из набора результатов в различных типах
данных. Есть также установленный порядок в этом множестве, который возвращает
размер результата (если это последовательность или BLOB) и количество
колонок в наборе результатов. Это разрушает подготовленный запрос,
созданный предшествующим sqlite3_prepare().
Каждый подготовленный запрос должен быть уничтожен, используя этот вызов,
чтобы избежать утечек памяти. Это закрывает соединение с базой данных,
ранее открытое sqlite3_open().
Все подготовленные запросы,
связанные со связью, должны быть закрыты
до закрытия связи. Приложение будет, как правило, использовать
sqlite3_open(), чтобы создать
связь базы данных
во время инициализации. Обратите внимание на то, что
sqlite3_open()
может использоваться, чтобы открыть существующие файлы базы данных или
создать и открыть новые файлы базы данных. В то время как много запросов
используют только одну связь базы данных,
нет никакой причины, почему приложение не может вызвать
sqlite3_open() много раз, чтобы открыть много
соединений
для той же самой базы данных или для различных баз данных.
Иногда многопоточное приложение будет создавать отдельные
соединения для каждого потока.
Обратите внимание на то, что связь
может получить доступ к двум или больше базам данных, используя команду SQL
ATTACH, таким образом, нет необходимости иметь
отдельное соединение с базой данных для каждого файла базы данных. Много запросов закрывают соединение через
sqlite3_close(). Или, например, приложение,
которое использует SQLite в качестве
формата файла приложения могло бы открыть
связь в ответ на действие в меню
File/Open и затем разрушить соответствующее
соединение с базой данных
в ответ на File/Close. Чтобы управлять SQL-оператором, приложение выполняет эти шаги: Предшествующее является всем, что действительно нужно знать, чтобы
использовать SQLite эффективно. Все остальное это оптимизация и детали. sqlite3_exec() это
обертка удобства, которая выполняет все четыре вышеупомянутых шага
единственным вызовом функции. Функция обратного вызова, переданная в
sqlite3_exec(),
используется, чтобы обработать каждую строку набора результатов.
sqlite3_get_table()
является другой оберткой удобства, которая делает все четыре из
вышеупомянутых шагов. sqlite3_get_table()
отличается от sqlite3_exec() тем, что это
хранит результаты запросов в памяти кучи вместо того, чтобы вызвать отзыв. Важно понять, что sqlite3_exec() или
sqlite3_get_table()
не делают что-либо, что не может быть достигнуто, используя ядро.
На самом деле эти обертки осуществляются просто с точки зрения ядра. В предшествующем обсуждении предполагалось, что каждый 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 это идентификатор. У параметра первоначально есть значение NULL.
До запроса sqlite3_step()
впервые или немедленно после sqlite3_reset()
приложение может вызвать sqlite3_bind(),
чтобы присоединить значение к параметрам. Каждый вызов
sqlite3_bind() отвергает предшествующие
привязки на том же самом параметре. Приложению позволяют подготовить многократные SQL-операторы заранее и
оценить их по мере необходимости. Нет никакого произвольного предела
количеству выдающихся подготовленных запросов.
Некоторые запросы вызывают sqlite3_prepare()
многократно при запуске, чтобы создать все
подготовленные запросы, в которых они будут когда-либо нуждаться.
Другие запросы держат кэш последний раз используемых
подготовленных запросов и затем повторно
используют их, когда доступно. Другой подход должен снова использовать
подготовленные запросы только,
когда они в цикле. Конфигурация по умолчанию для SQLite работает отлично для большинства
запросов. Но иногда разработчики хотят подправить установку, чтобы попытаться
отжать немного больше работы или использовать в своих интересах
некоторую неясную особенность. sqlite3_config()
используется, чтобы сделать глобальные изменения конфигурации всего процесса
для SQLite. sqlite3_config()
нужно вызвать, прежде чем любые
соединения с базой данных создаются.
sqlite3_config()
позволяет программисту делать такие вещи, как: После того, как конфигурация всего процесса готова и
соединения с базой данных
были созданы, отдельные соединения с базой данных могут формироваться,
используя sqlite3_limit() и
sqlite3_db_config(). SQLite включает интерфейсы, которые могут использоваться, чтобы расширить
его функциональность. Такой установленный порядок включает: sqlite3_create_collation()
используется, чтобы создать новые
последовательности сопоставления
для сортировки текста.
sqlite3_create_module() используется, чтобы зарегистрировать новые
виртуальные таблицы.
sqlite3_vfs_register()
создает новый VFS. sqlite3_create_function()
создает новые функции SQL, скалярные или совокупности.
Новая реализация функции, как правило, использует
следующие дополнительные интерфейсы: Все встроенные функции SQL SQLite создаются, используя точно эти те же
самые интерфейсы. Обратитесь к исходному коду SQLite,
в особенности к исходным файлам
date.c и
func.c
для примеров. Общие библиотеки или DLL могут использоваться в качестве
загружаемых расширений SQLite. Эта статья только упоминает самые важные и обычно используемые интерфейсы
SQLite. Библиотека SQLite включает многих других API, реализующих полезные
опции, которые не описаны здесь.
Полный список функций,
которые формируют прикладной программный интерфейс SQLite, есть
здесь.
Обратитесь к тому документу для полной и достоверной информации обо
всех интерфейсах SQLite.
Choose any three.
1. Обзор
2. Введение
3.
Объекты и интерфейсы ядра
4. Типичное применение объектов ядра
5. Обертки удобства вокруг ядра
6. Привязка параметров и подготовленные запросы
7. Настройка SQLite
8. Расширение SQLite
9. Другие интерфейсы