Программирование SQLite на Си. Учебное пособие 2

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

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

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

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

Таблица может содержать до 2000 столбцов или, если вы перекомпилируете источник, вы можете увеличить его до 32 767 столбцов.

API SQLite

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

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

instagram viewer

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

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

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

Электронная таблица состоит из трех столбцов: Даты, Место проведения, Тип события и около десяти подобных событий. Даты проходят с 21 по 30 июня 2013 года.

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

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

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

Три таблицы:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вернуться к коду

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

  • Новый в SQL? Читать Что такое SQL?

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

Функции SQLite C API

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

  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. Я отображаю дату в виде числа, но не стесняюсь конвертировать ее в дату.

Листинг примера кода

instagram story viewer