Содержание
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 и расширений для работы с ней.