SQLite для кроссплатформенной разработки в Delphi XE2
Уже больше года прошло с момента публикации статьи "SQLite в Delphi 2010." Надо сказать, что рассмотренный в статье SQLiteWrapper я успешно использовал и в Delphi 2010 и в Delphi XE. Знаю, что есть ещё несколько подобных реализаций для работы с SQLite в Delphi, но почему-то этот wrapper мне понравился более всего - небольшой по размеру, удобный в использовании, простой в изучении. Что ещё для счастья нужно? Никакого паролирования мне для баз SQLite мне не требовалось поэтому использовал себе и использовал разработку Тима Андерсона (Tim Anderson). Но, как говориться, прогресс не стоит на месте и вот вышла Delphi XE2, сама SQLite вроде бы тоже несколько раз "апнулась". Соответственно, поддержка x64, FireMonkey и прочие довольно обширные нововведения в Delphi, а также обновление библиотеки SQLIte. dll внесли свои коррективы в разработку. и мой любимый враппер дал сбой. Нет, он конечно и раньше требовал, например, передачу в параметры методов исключительно AnsiString, но это, можно сказать, мелочи. А тут вдруг после сборки проекта под XE2 перестали работать некоторые методы, например FieldAs. Bind и пр. Посыпались исключения. Первым делом глянул в репозиторий, но там оказалась ревизия от февраля месяца, т. е. для XE2 не предназначенная, да и среди нововведений значился только бэкап баз данных.
Решил немного пошерстить Сеть в поисках подходящего враппера для SQLite в Delphi XE2. И был приятно удивлен, что разработка Тима Андерсона жива, здорова и даже теперь уже "пышет" кроссплатформенностью. Правда изменились/исчезли некоторые методы, но и добавилось достаточно. Собственно эту находку я сегодня и решил представить в своем блоге.
Итак, первым делом заходим в репозиторий на Google Code и скачиваем исходники себе на компьютер.
Итак, что появилось в обновленной версии. Прежде всего - это поддержка Unicode. Теперь все методы работают не с AnsiString как это было в предыдущей версии, а со String, что избавляет от некоторых лишних "телодвижений" при работе с SQLite в Delphi.
Появились типы TDate и TDateTime .
Для класса TSQLiteDatabase :
Добавлен метод Attach для добавления к текущему соединению нового файла базу данных (подробнее см. документацию);
Добавлен классовый метод AddNewSupportedColumnType;
Удален метод BindData
Удалены несколько перегруженных методов, таких как GetTable, GetTableString, GetTableValue
Для класса TSQLiteTable
Добавлено свойство IsLastRow: boolean
Удалено свойство FieldAsString и вместо него добавлено аналогичное - FieldValByNameAsString (зачем? Посмотрим ниже)
Для класса TSQLiteUniTable
Добавлен новый метод FindField(const AFieldName: string): TSQLiteField;
Добавлены новые свойства FieldsVal, FieldByName, FieldByNameAsString, FieldIndex, SQL, Stmt
Добавлен новый класс TSQLitePreparedStatement
Добавлен новый клсс TSQLiteField
Ну, а раз появились новые классы, методы и свойства, то их надо изучить и попробовать использовать в работе. Для примера создадим простенькую базу данных, состоящую из одной таблички и будем читать/писать данные, по возможности использую новые типы данных.
Для создания базы данных можете выбрать любую из программ для работы с SQLite, например, рассмотренных в статье "Обзор программ для администрирования баз данных SQLite.". Я буду пользоваться бесплатной версией SQLite Expert.
Итак, создаем новую базу данных с названием TestSQLite. db и таблицей:
Теперь создаем новое приложение в Delphi XE2, бросаем в папку с проектом модели SQLite3 и SQLiteTable3 и библиотеку sqlite3.dll.
Добавим на форму приложения 2 кнопки, 4 Label'а и Memo. Внешний вид приложения будет такой:
Теперь создадим три переменные в секции private класса формы:
На OnCreate будем подключаться к БД и получать количество строк в БД. Обработчик будет следующим: