уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Как известно, для работы с различными базами данных в Delphi есть достаточно возможностей — от dbExpress до библиотеки FireDAC (ex. AnyDAC). Каждый набор компонентов по-своему хорош и, безусловно, может использоваться при разработке приложений для работы с базами данных в Delphi, в том числе и с SQLite. За всё время работы с SQLite я использовал DBExpress, FireDAC, платные компоненты доступа к БД и небольшие бесплатные библиотеки от других разработчиков, которые были очень даже удобные и работоспособные.

Но, сейчас, уже имея кое-какой багаж знаний по всем этим библиотекам и компонентам, я могу с уверенностью сказать, что удобнее всего мне было работать с компонентами LiteDAC о которых я рассказывал в прошлом году. Я ни в коем случае не хочу сказать, что все остальные компоненты плохие и неудобные. Просто — с LiteDAC было удобнее и комфортнее. И эти компоненты стоят того, чтобы ещё раз о них рассказать. Тем более, что до 11 января 2015 года Вы имеете возможность получить абсолютно бесплатно лицензию на компоненты от Devart или же хорошую скидку при покупке. Но об этом позже. 

В предыдущем обзоре я кратко рассмотрел такие моменты работы с компонентами LiteDAC как подключение к БД SQLite с помощью TLiteConnection, создание дампов и восстановление БД с помощью TLiteDump, шифрование БД, работу с LiteSQL и использование транзакций при работе с LiteDAC. Теперь посмотрим, как использовать и другие возможности LiteDAC.

В прошлый раз мы разобрались с тем как подключаться к БД и создавать файл базы «на лету». Делается это так:

  1. Бросаем на форму компонент TLiteConnection
  2. Так как файл БД мы будем создавать при запуске приложения, то свойство TLiteConnection.Options.ForceCreateDatabase устанавливаем в True
  3. В обработчике события OnBeforeConnect у  TLiteConnection пишем:
procedure
TForm1.LiteConnection1BeforeConnect(Sender: TObject);
begin
   LiteConnection1.Database:=TPath.Combine(TPath.GetDocumentsPath, 'phones.db');
end;

В итоге, при первом запуске приложения будет создан файл базы данных с названием «phones.db», найти который можно будет в Android по пути:

/data/data/com.embarcadero.Project1/files/phones.db

а в Windows:

C:\Users\%UserName%\Documents\phones.db

Ну, а после подключения к БД мы уже можем делать с БД всё, что хотим — создавать/удалять таблицы, запрашивать данные и т.д. И на этапе отладки приложения было бы замечательно отслеживать все «движения», касающиеся базы данных, включая и ошибки. Для этого, например, в dbExpress имеется специальный компонент — TSQLMonitor. Посмотрим, что нам предлагается использовать в LiteDAC.

Работа с DBMonitor и TLiteSQLMonitor

Чтобы расширить возможности мониторинга приложений, в LiteDAC  есть дополнительный компонент под названием TLiteSQLMonitor, а также инструмент под названием  DBMonitor. DBMonitor представлен как альтернатива Borland SQL Monitor, который также поддерживается LiteDAC. Выглядит DBMonitor следующим образом:

DBMonitor

Соответственно, при работе с LiteDAC Вы можете выбирать, какой из инструментов будет использоваться для мониторинга — DBMonitor или же SQL Monitor.

Для того, чтобы выводить данные мониторинга в DBMonitor необходимо выполнить следующие простые действия:

  1. Бросаем на форму компонент TLiteSQLMonitor
  2. Устанавливаем True у свойства TLiteSQLMonitor.Options.moDBMonitor
  3. В свойстве TLiteSQLMonitor.TraceFlags выбираем операции с базой данных, которые будут мониториться
  4. У компонентов LiteDAC, работу которых мы хотим мониторить, устанавливаем в True свойство Debug
  5. Запускаем DBMonitor (выбираем соответствующую опцию в контекстном меню TLiteSQLMonitor).

Теперь можно запустить приложение и убедиться, что DBMonitor прекрасно работает в Windows. Также Вы можете использовать DBMonitor и при разработке приложений с LiteDAC под Android. Всё, что нужно для этого сделать — это указать в свойстве TLiteSQLMonitor.DBMonitorOptions.Host IP-адрес вашего компьютера на котором установлена Delphi.

Если же Вы хотите выводить лог работы с базой данных в своем приложении, то для этого у TLiteSQLMonitor имеется событие OnSQL:

TOnSQLEvent = procedure (Sender: TObject; Text: string; Flag: TDATraceFlag) of object;

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

Макросы в LiteDAC

При параметры в запросах к SQLite я рассказывал в прошлом обзоре LiteDAC, когда рассказывал про работу с компонентом TLiteSQL.

Макросы же позволяют менять вообще весь SQL-запрос динамически. Например, мы часто используем SELECT для выборки данных из различных таблиц БД. Такие запросы мы можем выполнять как обычно, например:

LiteQuery1.SQL.Text:='SELECT * FROM employees';
LiteQuery1.Open;
//поработали с записями
LiteQuery1.Close;
//новый запрос для другой таблицы
LiteQuery1.SQL.Text:='SELECT * FROM phones';
LiteQuery1.Open;

А можем воспользоваться макросом. Имя макроса всегда начинается с символа &. Например, мы можем переписать пример выше с использованием макроса так:

LiteQuery1.SQL.Text:='SELECT * FROM &TableName';
LiteQuery1.MacroByName('TableName').Value:='employees';
LiteQuery1.Open;
//поработали с записями
LiteQuery1.Close;
LiteQuery1.MacroByName('TableName').Value:='phones';
LiteQuery1.Open;

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

Компонент TLiteLoader

Ещё один довольно простой, но, тем не менее, интересный и полезный компонент. TLiteLoader позволяет загружать в БД данные из внешних источников. Ну, например, у нас есть в базе есть таблица, содержащая имена сотрудников и номера кабинетов в которых они сидят работают:

CREATE TABLE [employees] ([e_id] INTEGER,[e_fio] TEXT, [e_room_number] INTEGER);

И есть другая БД, которая содержит эту же информацию. Используя TLiteLoader мы можем буквально одной строкой кода перенести все записи из одной БД в другую. Реализуется это довольно просто:

  1. Бросаем на форму TLiteLoader
  2. В свойстве TLiteLoader.Connection указываем компонент TLiteConnection, используя который мы подключаемся к нашей базе данных
  3. В свойстве TLiteLoader.TableName указываем имя таблицы, в которую мы будем вносить изменения
  4. В свойстве TLiteLoader.Columns указываем столбцы таблицы, в которые будем производить запись
  5. По желанию можем также указать значение в свойстве TLiteLoader.AutoCommitRowCount — когда количество перенесенных в наше БД записей будет равно значению этого свойства автоматически выполнится команда Commit.

Теперь нам необходимо получить набор данных (TDataSet) из внешней базы данных. Как вы это будете делать — не важно. Главное получить DataSet и выполнить всего один метод TLiteLoader:

LiteLoader1.LoadFromDataSet(LiteDataSource1.DataSet);

Также, для визуализации процесса загрузки данных можно бросить на форму ProgressBar, указав ему свойство Max равным 100 и создать такой обработчик события TLiteLoader.OnProgress:

procedure TForm1.LiteLoader1Progress(Sender: TObject; Percent: Integer);
begin
  ProgressBar1.Value:=Percent;
  Application.ProcessMessages;
end;

В итоге, ProgressBar будет плавно заполняться по мере переноса данных в нашу базу данных.

Подведем небольшой итог

Итак, в результате двух небольших обзоров LiteDAC мы рассмотрели следующее:

  1. Подключение к БД SQLite с помощью TLiteConnection
  2. Создание дампов и восстановление БД с помощью TLiteDump
  3. Шифрование БД SQLite
  4. Запись в БД данных с помощью LiteSQL и использование параметров в запросах
  5. Использование транзакций при работе с LiteDAC
  6. Работу с DBMonitor и компонентом TLiteSQLMonitor в Windows и Android
  7. Работу с макросами в SQL-запросах
  8. Работу с компонентом TLiteLoader для загрузки данных из внешних источников данных.

В принципе, все эти функции, при должных навыках, можно теперь реализовать в Delphi и с использованием тех же компонентов FireDAC. Но, как я уже сказал выше, лично для меня работа с LiteDAC представляется более простой и понятной, чем с другими, ранее используемыми компонентами. Ну, а то, что LiteDAC прекрасно работает и под Windows и под Android и говорить не приходится.

А теперь расскажу как получить LiteDAC и другие компоненты от Devart бесплатно.

Как получить LiteDAC бесплатно?

До 12 января компания Devart проводит конкурс на лучшую новогоднюю фотографию. Всё, что нужно сделать — это:

  1. Скачать trial любого продукта Devart и установить его
  2. Устроить на своем рабочем месте атмосферу праздника — поставить на стол новогоднюю елку (маленькую, конечно же), напялить на себя костюм Деда Мороза, обмотать монитор мишурой и т.д. и т.п.
  3. Сделать интересную новогоднюю фотографию на которой будет видно, что вы используете продукцию Devart, т.е. на фотку должен попасть монитор вашего компа.
  4. Постите фотографию вот на этой страничке Facebook до 11 января
  5. Голосуете за свою фотографию сами, просите друзей проголосовать, рассылаете ссылочку на фотку родственникам с просьбой лайкнуть и т.д.

Чья фотка наберет больше голосов — тот и победитель. А призы следующие:

  1. 1 место бесплатная лицензия
  2. 2 и 3 место — дополнительная скидка 30% к новогодней (новогодняя 20%) = 50%
  3. 4 и 5  место — дополнительная скидка 20% к новогодней
  4. с 6 по 10 место — дополнительная скидка 10% к новогодней

Победители будут названы 12 января 2015 года. Не упустите свой шанс получить классные компоненты для доступа к базам данных бесплатно!

На этом пока всё. В следующий раз будет пост про DevExpress и Google Calendar API, ну и по традиции — подведение итогов работы блога за 2014 год.

UPDATE 26/07/2015

Компания Devart выпустила новую линейку улучшенных ODBC драйверов среди которых SQLite ODBC драйвер.
Особенности драйвера:
  • Прямой режим (Direct Mode) — позволяет присоединяться к вашим базам данных через протокол TCP\IP без использования клиента SQLite, таким образом упрощая процесс разработки приложения и увеличивая производительность
  • ODBC драйвер полностью поддерживает стандартные ODBC API функции и типы данных
  • Доступны параметры advanced connection string, которые позволяют любым desktop и web приложениям получать доступ к базам данных с различных сред и платформ, которые поддерживают ODBC
  • Полная поддержка Unicode предоставляет возможность интерпретировать вызовы функций Unicode без вмешательства работы Driver Manager
  • Улучшенная конверсия данных из типов данных DMBS в типы данных ODBC
  • Поддержка Windows, Linux, Mac OS X как на 32х так и на 64х битных платформах
  • Поддержка всех версий SQLite
Доступна бесплатная версия драйвера
Заинтересовала работа с LiteDAC в Delphi? Купи LiteDAC прямо сейчас в магазине AllSoft.ru

Книжная полка

Автор: Дмитрий Осипов
Название:Базы данных и Delphi. Теория и практика
Описание Книга основана на материалах лекций и практических занятий, разработанных автором, и объединяет теоретические основы и практические аспекты разработки реляционных баз данных.
Купить на ЛитРес 383 руб.
Автор: Анатолий Хомоненко, Владимир Гофман
Название:Работа с базами данных в Delphi
Описание: Рассматривается использование средств Delphi для разработки приложений баз данных. Даются понятия баз данных, характеризуются элементы и описываются этапы проектирования реляционных баз данных, изложена технология разработки информационных систем, освещаются приемы работы с данными, создание таблиц и приложений баз данных, подготовка отчетов.
Купить на ЛитРес 151 руб.
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
2 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
rboy
rboy
29/01/2015 00:55

Подскажите, если не трудно, по sqlite3 столкнулся с совершенно неожиданной проблемой. при банальном поиске значений типа «SELECT * FROM table WHERE field LIKE %string%» находятся только результаты, совпадающие по регистру. т.е. если в базе строка «Иван», то поиск по «иван» ничего не вернет, а «Иван» — вернет. Копание в интернетах привело к тому, что это типо как фича sqlite и родного решения нет, есть только несколько изысканных костылей. в блоге у вас множество статей именно по sqlite, думаю, вы сталкивались с такой фигней. не знаете случайно, как ее проще всего решить? если слепой — не обессудьте, ткните носом, где почитать.

B3nT3n
B3nT3n
06/04/2015 03:36

С Sqllite еще не работал, но в Firebird решается так
SELECT * FROM table WHERE UPPER(field) LIKE UPPER(‘%string%’)
или
SELECT * FROM table WHERE UPPER(field) CONTAINING UPPER(‘string’)