SQLite.NET — библиотека для работы с базами данных SQLite в C#

SQLite.NET- это небольшая библиотека для работы с базами данных SQLite в C#, разработанная с использованием ORM-технологии (object-relational mapping — отображения данных на реальные объекты), которая позволяет абстрагироваться от непосредственного создания базы данных и оперировать всеми операциями в базе данных на уровне объектов C#. Изначально, библиотека разрабатывалась для работы в Xamarin.iOS, однако, на данный момент может использоваться на всех доступных платформах, включая .NET 7, UWP и т.д.

Добавление SQLite.NET в проект

Создадим пустое консольное приложение .NET 7 и с помощью менеджера пакетов NuGet добавим в проект новые пакет с названием sqlite-pcl-net.

sqlite-pcl-netПри установке пакета вам будет предложена установка дополнительных пакетов, которые необходимы для работы SQLite.NET — их таже необходимо установить

Дополнительные пакеты для SQLite.NET
Дополнительные пакеты для SQLite.NET

После выполнения этих действий, в обозревателе решений в вашем проекте появятся необходимые пакеты для работы с SQLite в C#:

Результат установки SQLite.NET
Результат установки SQLite.NET

Теперь всё готово для работы с SQLite в C#. Попробуем создать свое первое приложение с SQLite.NET.

Первое приложение с SQLite.NET

Как было сказано выше, изначально SQLite.NET позиционировалась как легкая, быстрая библиотека для работы с SQLite и разработчикам удалось этого добиться. Попробуем создать свое первое приложение для работы с SQLite. Пусть, например, это приложение работает с данными групп студентов. Для начала, создадим необходимые для работы классы C#. Во-первых, это класс группы:

public class Group
{
    /// <summary>
    /// Идентификатор группы в БД
    /// </summary>
    public int Id { get; set; }
    /// <summary>
    /// Название (номер) группы
    /// </summary>
    public string Name { get; set; }
}

Во-вторых, это класс, описывающий одного студента:

public class Student
{
    /// <summary>
    /// Идентификатор студента в БД
    /// </summary>
    public int Id { get; set; }
    /// <summary>
    /// Идентификатор группы студента
    /// </summary>
    public int GroupId { get; set; }
    /// <summary>
    /// Ф.И.О. студента
    /// </summary>
    public string Name { get; set; }

}

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

Подключение к БД SQLite и создание необходимых таблиц

Использование технологии ORM позволяет нам выполнять какие-либо операции с БД, оперируя понятиями объектно-ориентированного программирования, то есть — классами, объектами, их свойствами и методами. Так, для этих целей в SQLite.NET используются специальные атрибуты, находящиеся в пространстве имен SQLite. С помощью этих атрибутов мы как бы «размечаем» наши классы, указывая библиотеке, что является таблицей, какие свойства применять к тому или иному столбцу и так далее.

Итак, нам необходимо создать в базе SQLite две таблицы — таблицу, содержащую группы студентов и таблицу, содержащую списки студентов в группах. Подключаем через using пространство имен SQLite и указываем необходимые атрибуты в разработанных выше классах:

[Table("groups")]
public class Group
{
    [PrimaryKey, AutoIncrement]
    [Column("id")]
    public int Id { get; set; }
    [Column("name")]
    public string Name { get; set; }
}

[Table("students")]
public class Student
{
    [PrimaryKey, AutoIncrement]
    [Column("studentId")]
    public int Id { get; set; }
    [Column("groupId")]
    public int GroupId { get; set; }
    [Column("name")]
    public string Name { get; set; }

}

Рассмотрим, что за атрибуты мы указали.

Table— атрибут, применяемый только к классам. Используется для указания того, что представленный класс будет отображен в базе данных как таблица. Соответственно, поля класса будут формировать столбцы таблицы. Атрибут имеет следующее описание:

[Table(Name, WithoutRowId)]

  • Name — имя таблицы в БД (обязательный параметр)
  • WithoutRowId — указывает на то, что таблица должна создаваться без rowid (что это такое — см. здесь). По умолчанию этот параметр равен false.

PrimaryKey — атрибут, указывающий на то, что свойство является первичным ключом.

AutoIncrement — указывает на то, что в БД этот свойство класса будет увеличиваться на 1 автоматически (автоинкрементное поле)

Column — атрибут, задающий свойства конкретного столбца таблицы. С помощью этого атрибута мы можем переопределить название столбца в БД. Так, например, свойство Id класса Student будет определено в таблице SQLite как studentId. Атрибут имеет следующее описание:

[Column(Name)]

  • Name — название столбца в базе данных (обязательный параметр)

Теперь создадим нашу первую базы данных SQLite и посмотрим на результат. Первый вариант создания таблиц:

SQLiteConnection connection = new SQLiteConnection("students.sqlite");//создаем подключение к БД
//создаем необходимые таблицы
connection.CreateTable<Student>();
connection.CreateTable<Group>();

В начале мы создали подключение к базе данных (SQLiteConnection), которое в дальнейшем будет использоваться для работы с базой данных.  После этого, мы создали две таблицы в новой БД. В данном случае мы, используя метод CreateTable создали две таблицы. Второй вариант — использовать метод CreateTables, передав в качестве второго параметра массив типов:

connection.CreateTables(CreateFlags.None, new Type[] { typeof(Group), typeof(Student) });

В обоих случаях будет создана новая база данных в файле students.sqlite, содержащая две таблицы:

CREATE TABLE "groups" (
"id" integer primary key autoincrement not null ,
"name" varchar );

CREATE TABLE "students" (
"studentId" integer primary key autoincrement not null ,
"groupId" integer ,
"name" varchar );

В приведенном выше примере мы воспользовались самым простым конструктором для SQLiteConnection, просто указав файл БД. При подключении библиотека сама определила есть ли такой файл, создала его и предоставила БД для дальнейшей работы. Так, файл БД создан рядом с exe-файлом приложения:

Файл базы данных SQLite
Файл базы данных SQLite

Мы ещё рассмотрим более подробно другие конструкторы класса SQLiteConnection.

Запись и чтение данных

Для первого знакомства с SQLite.NET добавим в наше приложение возможность записывать и читать данные из БД:

//добавим в таблицу groups новую группу
connection.Insert(new Group() {	Name = "Test" });

//получаем rowId последней добавленной записи в таблицу groups
int lastId = connection.ExecuteScalar<int>("SELECT last_insert_rowid()");

//добавим в группу нового студента
connection.Insert(new Student()	{Name = "Иванов Иван Иванович",	GroupId = lastId });

//считываем данные из таблиц
var groups = connection.Table<Group>();
foreach (Group db_group in groups) 
{
    Console.WriteLine($"{db_group.Id} - {db_group.Name}");
}

var students = connection.Table<Student>();
foreach (Student db_student in students)
{
    Console.WriteLine($"{db_student.Id} - {db_student.Name}");
}

Чтобы добавить новые данные в какую-либо таблицу SQLite мы используем метод Insert в параметры которого передается объект определенного типа. SQLite.NET сама по типу объекта определяет в какую таблицу его записать. Более того, обратите внимание на то, что мы не указывали значения Id у создаваемых объектов так как эти свойства в базе данных созданы как autoincrement.

Соответственно, для чтения данных из БД мы использовали универсальный метод Table, указав тип объектов, которые необходимо вернуть в результате. В результате выполнения метода Table возвращается объект типа TableQuery, который реализует интерфейс IEnumerable, поэтому мы можем сразу использовать этот объект в цикле foreach для перечисления всех объектов. Результат выполнения представленного выше кода будет следующий:

1 — Test
1 — Иванов Иван Иванович

Итого

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

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии