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

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

Теперь всё готово для работы с 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-файлом приложения:

Мы ещё рассмотрим более подробно другие конструкторы класса 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 — Иванов Иван Иванович
Итого
Сегодня мы познакомились с библиотекой SQLite.NET в C# и создали простенькое приложение для чтения и записи данных в БД SQLite. Однако, работа с этой библиотекой не заканчивается исключительно на простейших операциях с БД, поэтому, в дальнейшем мы ещё не раз вернемся к работе с этой библиотекой и рассмотрим другие вопросы, касающиеся SQLite.NET и расширений для работы с ней.