Программирование SQLite на C Учебник 2

Этот учебник является вторым в серии по программированию SQLite на C.

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

Если это помогает, подумайте о каждой строке как о структуре , со столбцами в таблице, соответствующими полям в структуре.

Таблица может иметь столько строк, сколько поместится на диске. Существует верхний предел, но если быть точным, его огромные 18 446 744 073 709 551 616.

Таблица может иметь до 2000 столбцов или, если вы перекомпилируете исходный код, вы можете максимизировать его в потрясающие 32 767 столбцов.

API SQLite

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

Во-первых, нам нужен дескриптор базы данных. Это тип sqlite3 и возвращается вызовом sqlite3_open (filename, ** ppDB). После этого мы выполняем SQL.

Давайте сначала сделаем небольшое отступление и создадим пригодную для использования базу данных и несколько таблиц с помощью SQLiteSpy. (Ссылки на это и на браузер базы данных SQLite см. В предыдущем руководстве).

События и места

База данных о. DB будет держать три стола для управления событиями на нескольких площадках. Эти мероприятия будут вечеринками, дискотеками и концертами и будут проходить на пяти площадках (альфа, бета, чарли, дельта и эхо). Когда вы моделируете что-то подобное, часто помогает начать с электронной таблицы. Для простоты я просто сохраню дату, а не время.

В таблице есть три столбца: даты, место, тип события и около десяти событий, например это. Даты действуют с 21 по 30 июня 2013 года.

Теперь SQLite не имеет явного типа даты, поэтому его проще и быстрее сохранить как int и то же самое. То, как Excel использует даты (дни с 1 января 1900 г.), имеют значения int от 41446 до 41455. Если вы поместите даты в электронную таблицу, а затем отформатируете столбец даты как число с 0 десятичными знаками, это будет выглядеть примерно так:

Теперь мы могли бы хранить эти данные в одной таблице, и для такого простого примера это, вероятно, было бы приемлемо. Однако хорошая практика проектирования базы данных требует некоторой нормализации.

Уникальные элементы данных, такие как тип места проведения, должны быть в отдельной таблице, а типы событий (вечеринка и т. Д.) Также должны быть в одной. Наконец, поскольку у нас может быть несколько типов событий в нескольких местах (отношение «многие ко многим»), нам нужна третья таблица для их хранения.

Три таблицы являются:

  • Venues – содержит все пять мест;
  • типы событий – содержит все три типа событий
  • events – содержит дату, идентификатор места и идентификатор типа события.. Я также добавил поле описания для этого события, например «День рождения Джима».

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

SQL для его создания:

Индекс в таблице событий содержит дату, идентификатор события, тип события и место проведения. Это означает, что мы можем запросить в таблице событий «все события на дату», «все события в месте проведения», «все стороны» и т. Д. И их комбинации, такие как «все стороны в месте проведения» и т. Д.

После выполнения запросов на создание таблиц SQL создаются три таблицы. Обратите внимание, я поместил весь этот sql в текстовый файл create.sql, и он включает данные для заполнения некоторых из трех таблиц.

Если вы поместите; в конце строк, как я сделал в create.sql, вы можете объединить и выполнить все команды за один раз. Без ; вы должны запускать каждый отдельно. В SQLiteSpy просто нажмите F9, чтобы запустить все.

Я также включил sql, чтобы удалить все три таблицы внутри многострочных комментариев, используя/* .. * /то же, что и в C. Просто выберите три строки и нажмите Ctrl + F9, чтобы выполнить выделенный текст.

Эти команды вставляют пять мест:

Я снова включил закомментированный текст в пустые таблицы с помощью строк delete from . Здесь нет отмены, поэтому будьте осторожны с ними!

Удивительно, но со всеми загруженными данными (правда, небольшими) весь файл базы данных на диске занимает всего 7 КБ.

Данные о событиях

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

Примечание. Любая строка с точкой ( .) префикс – это команда. Используйте .help для просмотра всех команд. Чтобы запустить SQL, просто введите его без префикса точки.

Вы должны использовать двойные черные косые черты \ в пути импорта для каждой папки. Делайте только последнюю строку после успешного выполнения .import. Когда SQLite3 запускается, разделителем по умолчанию является a: поэтому перед импортом его необходимо заменить на запятую.

Назад к коду

Теперь у нас есть полностью заполненная база данных, давайте напишем код C для выполнения этого SQL-запроса, который возвращает список сторон с описанием, датами и местом проведения.

  • Новичок в SQL? Прочтите, что такое SQL?

Это выполняет соединение с использованием столбца idvenue между таблицей событий и мест, поэтому мы получаем название места, а не его внутренняя стоимость.

Функции API SQLite C

Функций много, но нам нужно лишь несколько. Порядок обработки следующий:

  1. Открыть базу данных с помощью sqlite3_open (), выйти, если при открытии возникла ошибка.
  2. Подготовьте SQL с помощью sqlite3_prepare ()
  3. Цикл с использованием slqite3_step () до тех пор, пока не закончатся записи
  4. (В цикле) обработайте каждый столбец с помощью sqlite3_column …
  5. Наконец, вызовите sqlite3_close (db)

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

Итак, в программе, указанной ниже, псевдокод для основных шагов:

sql возвращает три значения, поэтому, если sqlite3.step () == SQLITE_ROW, значения копируются из соответствующих типов столбцов. Я использовал int и text. Я отображаю дату как число, но не стесняйтесь преобразовать ее в дату.

Список примеров кода

Оцените статью
recture.ru
Добавить комментарий