Локальное хранение данных с помощью SQLite
SQLite полезно, если вы используете реляционные данные. Предположим, вы создаете приложение для социальных сетей. Вам нужно хранить сведения о подписчиках этого приложения. Эти данные включают уникальный идентификатор для каждого пользователя и их имени. Эту связь можно легко моделировать в базе данных SQLite.
В этом уроке вы узнаете, как использовать SQLite в приложении .NET MAUI с помощью SQLite-net.
Что такое SQLite?
SQLite — это упрощенная кроссплатформенная локальная база данных, стандартная для мобильных приложений. SQLite не требует сервера. База данных хранится в одном файле в файловой системе на диске устройства. Все операции чтения и записи выполняются непосредственно в файле SQLite на диске.
Собственные библиотеки SQLite по умолчанию встроены в Android и iOS; однако подсистема поддерживает только API C/C++. Этот не идеальный сценарий для разработчиков .NET, которым требуется взаимодействие между SQLite и .NET.
Что такое SQLite.NET?
Существует несколько оболочек C# для собственного ядра SQLite, которые могут использовать .NET-разработчики. Многие разработчики .NET используют популярную оболочку C#, называемую SQLite-net.
SQLite.NET — это объектно-реляционный модуль сопоставления. Это помогает упростить процесс определения схем базы данных, позволяя использовать модели, определенные в проектах, для использования в качестве схемы.
В качестве примера рассмотрим следующий класс, который моделирует User
:
class User
{
public int Id { get; set; }
public string Username { get; set; }
...
}
С помощью реляционного сопоставителя объектов вы можете принять этот начальный User
класс и создать таблицу базы данных, которая User
содержит столбцы для Id
этого класса и Username
поля.
SQLite.NET поставляется в виде пакета NuGet. Чтобы использовать его, необходимо добавить пакет sqlite-net-pcl в приложения.
Подключение к базе данных SQLite
Вы можете установить подключение к базе данных SQLite из приложения через SQLiteConnection
объект. Этот класс определяется в SQLite
пространстве имен вместе с другими типами и методами SQLite. При создании экземпляра этого объекта нужно передать имя файла для файла базы данных. Затем конструктор открывает файл, если он существует или создает его, если он отсутствует.
Пример кода приведен ниже.
using SQLite;
...
string filename = ...
SQLiteConnection conn = new SQLiteConnection(filename);
Помните, что filename
следует указать расположение в песочнице приложения.
Создание таблицы
Помните, что SQLite-net — это реляционная схема сопоставления объектов, что означает, что можно создать схему базы данных из классов C#. SQLite-net может создавать таблицу базы данных из обычного класса C#, но есть много атрибутов, которые можно добавить в класс для предоставления дополнительных метаданных. Эти метаданные помогают SQLite применять такие возможности, как уникальность значений, и применять ограничения к данным.
Доступные атрибуты:
Table
: укажите имя таблицы, если вы хотите, чтобы она не была чем-то другим, чем имя класса.PrimaryKey
: укажите, что столбец является первичным ключом.AutoIncrement
: укажите, что столбец должен автоматически увеличиваться при вставке новой строки.Column
: укажите имя столбца, если вы хотите, чтобы он был чем-то, кроме имени свойства.MaxLength
: укажите максимальное количество символов, которые можно использовать в столбце.Unique
: укажите, что значение в столбце должно быть уникальным из всех других строк.
В следующем коде показана обновленная версия User
класса, применяющего эти атрибуты:
[Table("user")]
public class User
{
// PrimaryKey is typically numeric
[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
[MaxLength(250), Unique]
public string Username { get; set; }
...
}
После определения класса C# вызовите универсальный CreateTable
метод класса SQLiteConnection
для создания таблицы в базе данных. Укажите класс в качестве параметра типа. Приведем пример:
SQLiteConnection conn = new SQLiteConnection(filename);
conn.CreateTable<User>();
Если таблица уже существует в базе данных, метод проверяет схему, чтобы узнать, CreateTable
есть ли какие-либо изменения. Если изменения есть, эта операция попытается обновить схему базы данных.
Выполнение базовых операций чтения и записи
После создания таблицы вы можете взаимодействовать с ней. Чтобы добавить строку, используйте Insert
метод в SQLiteConnection
экземпляре и укажите объект соответствующего типа, в котором хранятся данные для вставки. В следующем коде показано, как добавить новую строку в User
таблицу:
public int AddNewUser(User user)
{
int result = conn.Insert(user);
return result;
}
Метод Insert
возвращает значение int
, представляющее количество строк, вставленных в таблицу. В этом случае это один.
Чтобы получить строки из таблицы, используйте Table
метод. Этот метод возвращает коллекцию объектов (которые могут быть пустыми):
public List<User> GetAllUsers()
{
List<User> users = conn.Table<User>().ToList();
return users;
}
Метод Table
возвращает объект TableQuery\<T>
. Чтобы получить List
метод, используйте ToList
метод, как показано в предыдущем примере.
Выполнение запроса SQLite с помощью LINQ
Метод Table
извлекает все строки из таблицы. В большинстве случаев необходимо вернуть только подмножество строк, соответствующих набору указанных критериев. Для выполнения этих задач используйте LINQ для SQLite.NET.
SQLite.NET поддерживает многие общие запросы LINQ, в том числе:
Where
Take
Skip
OrderBy
OrderByDescending
ThenBy
ElementAt
First
FirstOrDefault
ThenByDescending
Count
С помощью этих методов можно использовать синтаксис метода расширения или синтаксис LINQ C#. Например, ниже приведен фрагмент кода, который позволяет получить сведения о указанном пользователе:
public User GetByUsername(string username)
{
var user = from u in conn.Table<User>()
where u.Username == username
select u;
return user.FirstOrDefault();
}
Обновление и удаление строк
Вы обновляете строку с помощью SQLiteConnection
метода объекта Update
. Предоставьте ему объект, определяющий строку, для которой вы хотите сохранить новые значения. Метод Update
изменяет строку с тем же значением первичного ключа, что и предоставленный объект. Возвращаемое значение — это количество измененных строк. Если это значение равно нулю, то строки с соответствующим первичным ключом не найдены, и ничего не было обновлено. Следующий фрагмент кода демонстрирует применение этого метода:
public int UpdateUser(User user)
{
int result = 0;
result = conn.Update(user);
return result;
}
Удалите строки из таблицы с SQLiteConnection
помощью метода объекта Delete
. Простейшая форма этого метода принимает первичный ключ элемента, который будет удален в качестве параметра, как показано в следующем примере. Эта форма метода является универсальной Delete
и требует параметра типа. Возвращаемое значение определяет количество строк, удаленных из таблицы:
public int DeleteUser(int userID)
{
int result = 0;
result = conn.Delete<User>(userID);
return result;
}