Использование SQLite в C#: Часть 4 – Проект SQLite.Net
SQLite.Net – это любительский проект с открытым программным кодом, ставящий своей целью реализацию работы с движком локально хранимых баз данных SQLite посредством обработки данных на уровне их объектных моделей. В идеологии SQLite.Net каждая модель данных – это отдельный объект, со своими свойствами и методами, низкоуровневую же часть работы с данными SQLite.Net берет на себя. Логика работы SQLite.Net реализована в файлах с исходным кодом SQLite.cs и SQLiteAsync.cs, которые добавляются непосредственно в состав разрабатываемого проекта. Библиотеки движка SQLite также должны быть включены в состав проекта, либо дистрибутив SQLite должен быть установлен в целевой системе. Простейший способ включить файлы SQLite.Net в состав своего проекта – воспользоваться менеджером пакетов NuGet, входящим в состав Visual Studio. Для этого необходимо открыть контекстное меню проекта в Solution Explorer, выбрать пункт Manage NuGet Packages…, далее в открывшемся окне NuGet переключиться в раздел Online/All и выполнить поиск по ключевому слову sqlite. Из результатов поиска вам необходимо выбрать и установить пакет sqlite-net, а также пакет System.Data.SQLite (x86/x64) в том случае, если вы ходите сразу добавить библиотеки SQLite в свой проект. Также можно скачать файлы SQLite.cs и SQLiteAsync.cs с ресурса https://github.com/praeclarum/sqlite-net и вручную добавить в состав разрабатываемого проекта. Работа с даннымиПервым делом, необходимо добавить в начало программного кода своего проекта директиву:
Центральным классом SQLite.Net является класс SQLiteConnection. Для создания нового объекта этого класса используется конструктор с несколькими параметрами:
По окончании работы желательно вызывать метод Dispose(). На случай исключительных ситуаций необходимо использовать конструкции try…catch…finally для обеспечения обязательного вызова этого метода. Если есть возможность, то лучше всего использовать оператор using():
В качестве входящего параметра при создании объекта класса SQLiteConnection передается имя файла базы данных, а также способ хранения даты и времени storeDateTimeAsTicks. Если в данном параметре передано значение true, то дата и время будут храниться в виде тиков, если передано значение false или параметр не указан, то значение будут храниться в текстовом виде. Также в конструкторе можно задать набор опций SQLiteOpenFlags, наиболее интересными из которых являются следующие: ReadOnly – только чтение данных; ReadWrite – чтение/запись данных; Create – если файл с указанным именем отсутствует, то создавать новый файл данных. По умолчанию конструктор использует опции SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create. Таким образом, если необходимо открыть файл с данными только для чтения, то можно использовать конструктор:
Создание структуры базы данных Для наглядности создадим следующий класс:
Свойства класса могут содержать предопределенные атрибуты, которые являются инструкциями для создания структуры таблицы в будущей базе данных. Наиболее существенными атрибутами являются: [PrimaryKey] – целочисленное значение будет использоваться для хранения значений первичного ключа; [AutoIncrement] – целочисленное значение будет автоматически увеличиваться при добавлении новых записей в таблицу; [Unique] – для данных значений будет выполняться контроль уникальности; [MaxLength] – задает ограничение для максимальной длины сохраняемого текстового значения; [Indexed] – значения в данной колонке будут проиндексированы; [NotNull] – для значений данной колонки будет выполняться контроль на уникальность; [Ignore] – свойство класса с данным атрибутом будет игнорироваться при работе с базой данных. Для создания новой таблицы в базе данных используется метод CreateTable() класса SQLiteConnection, например:
или
Для уничтожения таблицы используется метод DropTable():
Добавление данныхДля добавления данных в таблицу используется метод Insert() класса SQLiteConnection:
Метод принимает в качестве входящего параметра непосредственно добавляемый объект, а возвращает автоматически созданное значение первичного ключа. Также можно добавить сразу набор записей, передав какой-либо набор данных с интерфейсом IEnumerable, например, List:
В результате выполнения данного метода возвращается количество добавленных записей. Также стоит отметить метод InsertOrReplace(). Этот метод при добавлении нового объекта в базу данных проверяет наличие совпадений его свойств, помеченных атрибутом [Unique], с уже существующими записями и, в случае обнаружения совпадений, удаляет их. В результате своего выполнения метод возвращает количество замененных таким образом объектов. Изменение данныхДля обновления данных используется метод Update() класса SQLiteConnection. В качестве параметра в него передается обновляемый объект:
По аналогии с внесением данных, также можно обновить сразу несколько объектов, передав их список в метод UpdateAll():
Удаление данныхУдалить запись из таблицы можно вызовом метода Delete<>() класса SQLiteConnection, в качестве параметра передается идентификатор удаляемого объекта:
Полностью удалить данные из таблицы можно методом DeleteAll<>():
Работа с даннымиПростейший способ считать отдельную запись из базы данных – использовать метод Get<>() класса SQLiteConnection:
В качестве входящего параметра метод принимает идентификатор записи, в результате своего выполнения возвращает данные сразу в виде объекта. Для более продвинутой работы с данными предназначен класс TableQuery, возвращаемый методом Table<>() класса SQLiteConnection:
Класс TableQuery реализует синтерфейс IEnumerable, следовательно мы может считать данные последовательным перебором:
В классе TableQuery реализовано довольно много полезных методов для работы с данными, полный обзор которых выходит за рамки данной статьи, однако можно отметить ряд наиболее полезных. Получить количество записей в таблице можно с помощью метода Count():
Проверить наличие объекта в таблице можно с помощью метода Contains<>():
Получить значение по идентификатору можно с помощью метода ElementAt<>():
Класс TableQuery также дает возможность получать данные с помощью запросов LINQ:
Для того чтобы получить данные с помощью SQL-запросов, можно использовать метод Query<>() класса SQLiteConnection:
В результате выполнения запроса будет возвращен список List<> с выбранными данными, уже преобразованными в объекты. Если SQL-запрос предполагает возвращение единственного значения, то можно использовать метод ExecuteScalar<>():
Для выполнения SQL-команд, не предполагающих возврата каких-либо данных можно использовать метод Execute():
ТранзакцииДля реализации транзакционности в простейшем случае рекомендуется использовать следующую конструкцию:
Ваш код внутри этой обертки будет выполняться в рамках транзакции, в случае возникновения исключительной ситуации будет произведен откат, а по факту успешного выполнения кода транзакция будет зафиксирована. Если же необходимо более гибкое решение, то SQLite.Net предоставляет ряд методов для реализации данной задачи. Начало транзакции запускается вызовом метода BeginTransaction(), а завершение транзакции методом Commit(). Откат транзакции выполняется с помощью метода Rollback(): В процессе выполнения транзакции можно фиксировать промежуточные точки методом SaveTransactionPoint():
С помощью метода RollbackTo(saved) можно откатить транзакцию до заданной точки, а с помощью метода Release(saved) – зафиксировать транзакцию до указанной точки. ЗаключениеSQLite.Net позволяет разработчику быстро и комфортно реализовать работу с локально хранимыми данными за счет абстрагирования от низкоуровневой части реализации данной задачи. Данный подход может быть полезным для реализации небольших приложений, в частности мобильных, где нет нужды в сложных объектных моделях данных, а также не требуется обработка очень больших объемов данных. В противном случае лучше все же собраться с силами и работать напрямую с несравненно более богатым и гибким функционалом SQLite. Нужно четко осознать, что SQLite.Net не творит что-то чудесное внутри себя, а просто пытается автоматически формировать необходимые SQL-команды для работы с данными, при этом в сложных случаях движок вполне может принять решение загрузить в приложение ВСЕ данные из целевой таблицы и работать с ними уже внутри приложения. Ссылка на оригинал статьи: sergechel.info |
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.