SQLite и C++

Базы данных в игрострое — SQLite вам в помощь!

Давно известный факт, что база данных это неоспоримый лидер, среди многих форм хранения и обработки данных. Многим известны такие громкие названия как mySQL, ORACLE, PARADOX и многие другие. Никто не ставит под сомнение их возможности. Но существует и брат меньший — SQLite.

С точки зрения игростроя, можно смело сказать, что необходимость хранения данных крайне необходимая вещь. Если раньше для сохранения счета игрока, достаточно было держать один лишь файл, то сейчас, когда игрок пытается сохранить множество параметров, которые кроме всего прочего очень хочет и показать другим, файла мало, требуется хорошо отлаженная БД — база данных. В противном случае, разработчик просто погрязнет в множестве папок и файлов, созданных для сохранения различных аспектов, от уровня игрока, его силы или ловкости, до уровня, с перебором множества позиций, состояний и событий.

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

Почему SQLite?

Лично для меня ответ прост. Допустим, ваше приложение, или игра, или даже игровой сервер, могут иметь локальное место хранение данных. Например саперу, незачем выходить в сеть, для сохранения промежуточного счета. Или ваша игра является сетевой, с добротным сервером, который в свою очередь, может иметь базу данных, располагаемую на том же оборудовании, платформе, где находится сам. В этом случае, привлечение удаленной базы не совсем удачное решение (если конечно это не обуславливается какими то задачами или условиями). В этом случае, SQLite лучший помощник, база данных храниться вместе с программой и не требует дополнительного сервера! Весь обмен осуществляется из приложения к базе и обратно, по запросу самого приложения. Да, есть тут и минусы, но и плюсы на лицо. Было бы странно, если приложение использует системы, чьи ресурсы не может задействовать даже на 5%. Тот факт, что SQLite требует минимум ресурсов платформы, мультиплатформенная, работает локально и вполне себе дружит как с С++ так и C# да и в целом с .NET, дает свои преимущества при выборе средств хранения данных.

А нужно ли?

Ну что, еще не убедил? Честно говоря, конечно выбор схемы хранения данных, а тем более выбор средств — дело сугубо личное. Никто и никогда не скажет вам, что вы сделали неверный выбор, если ваше приложение или игра, не выдает ошибок, критов, и не вылетает, при работе с системой обработки данных. Даже файловая БД имеет право на жизнь, если все правильно сделано.

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

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

Если вы еще тут, возможно, вас заинтересовал вариант с локальной базой, без дополнительного софта и серверов. И раз вы все еще тут :), пожалуй начнем.

Текущий проект, где я решил применить локальную БД, строится на С++. По этому, эта часть статьи будет полезна тем, кто в первую очередь использует VS2015 от MICROSOFT, и программирует на С++.

Честно лично для меня предпочтение всегда падало в сторону C#, но звезды так сложились, что придется нам сначала переживать C++, а уж потом с чувством выполненного долга отправиться на просторы шарпа.

Как бы там ни было, но прежде, чем что-то программировать, придется сделать отступление в сторону настройки проекта. Об этом и будет пожалуй первая часть темы.

Этап подготовки проекта для работы с SQLite

Для начала официальный сайт разработчиков: http://www.sqlite.org/index.html

Полная документация по SQLite на английском языке: http://www.sqlite.org/docs.html

Скачиваем последнюю версию исходных файлов: http://sqlite.org/download.html

Вот еще, очень интересные моменты: https://sqlite.org/quickstart.html

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

Требуемые файлы

sqlite-amalgamation-201511301915.zip (архив с исходниками)

Извлекаем два файла:

sqlite3.c и sqlite3.h

Добавление файлов SQLite в собственный проект

Открываем иерахию проекта:

Добавление файлов в проект VS2015

Добавление файлов в проект VS2015

и добавляем файлик с расширением .h

добавление файла с расширением .h в проект

добавление файла с расширением .h в проект

 

Тем же путем добавляем и файл с расширением .c

И вот тут первая неожиданность, файл то С а не CPP, возможно, в каких то случаях, компилятор сам разберется, но это явно не мой случай. По этому приступаем к настройке проекта, иначе ничего не получится.

Настройки необходимые для корректной компиляции c SQLite

Находим наш sqlite3.c среди файлов проекта.

1- Щелкаем по файлу правой кнопкой мыши.

2- Выбираем «Свойства».

Открывается окно с набором закладок.

3- Открываем раздел «Дополнительно«,

4- Находим параметр «Компилировать как«,

5- Выбрать «С/TC»

6- Переходим в раздел «Предварительно откомпилированные заголовки»

7- Находим параметр «Предварительно откомпилированный заголовок«,

8- Выбираем «Не использовать предварительно скомпилированные заголовки»

В инспекторе файла (тот что под деревом) можно указать тип файла — С/С++

А теперь, тоже самое но в картинках:

Настройка параметров в VS2015 для SQLite  файлов

Настройка параметров в VS2015 lkz c файлов

Настройка параметров в VS2015 для SQLite  файлов

Настройка параметров в VS2015 для c файлов

Настройка параметров в VS2015для SQLite файлов

Настройка параметров в VS2015для c файлов

подключение заголовочного файла SQLite

В основном коде:

добавить

#include «sqlite3.h»

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

Хотел было я все в одной статьей написать, но не успеваю, да и читать удобнее с разбивкой. Поэтому, сейчас привожу демонстрационный код, который я любезно подсмотрел на других ресурсах. Главное, что если он скомпилируется, проект запустится и в папке с проектом создастся файл БД, значит успех! Можно продолжать работать и экспериментировать. До тех пор, пока данный код не заработает, дальнейшие действия бессмысленны.

**********КОД КОД КОД*************

#include «sqlite3.h»

const char* _SQLquery= «CREATE TABLE IF NOT EXISTS test(a,b,c); INSERT INTO test VALUES(1,2,3);»;

int main(int argc, char **argv) {

       sqlite3 *db = 0; // хэндл объекта соединение к БД

  char *err = 0;

// открываем соединение

     if (sqlite3_open(«test_database.db», &db))

             fprintf(stderr, «Error create DB: %s\n», sqlite3_errmsg(db));

// выполняем _SQLquery

else if (sqlite3_exec(db, _SQLquery, 0, 0, &err))

       {

             fprintf(stderr, «Error SQL query: %sn», err);

             sqlite3_free(err);

       }

// закрываем соединение

       sqlite3_close(db);

       fprintf(stderr, «error SQL: %sn», err);

       return 0;

}

**********КОД КОД КОД*************

Не пугайтесь, что без объяснений. В следующей статье займемся непосредственно программированием, там я постараюсь раскрыть тайну сие могущества. Но если не терпеться, в начале статьи, есть ссылки на всю необходимую документацию, а прямо перед «кодом» ссылка, где этот код прокомментирован и имеются неплохие советы. К сожалению, кое что там упущено, но об этом в другой раз.

 

Заключение

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

Следующая статья будет посвящена запросам, позволяющим действительно использовать базу по назначению. Но уже с примерами и комментариями.

Продолжение (дополнение с комментарием кода)

Продолжение Часть3

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Проверка * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.