Использование базы данных SQLite в приложении UWP
SQLite можно использовать для хранения и извлечения данных из упрощенной базы данных на устройстве пользователя. Это руководство содержит соответствующие инструкции.
Некоторые преимущества использования SQLite для локального хранения данных
✔️ SQLite легкая и автономная. Это библиотека кода без других зависимых компонентов. Ее не требуется настраивать.
✔️ Тут нет сервера базы данных. Клиент и сервер работают в одном процессе.
✔️ SQLite находится на общедоступном домене, поэтому вы можете свободно использовать и распространять ее в вашем приложении.
✔️ SQLite работает на разных платформах и архитектурах.
Подробнее о SQLite см. здесь.
Выбор слоя абстрагирования
Мы рекомендуем использовать Entity Framework Core или библиотеку SQLite с открытым исходным кодом, встроенные корпорацией Майкрософт.
Entity Framework Core
Entity Framework (EF) — это объектно-реляционный модуль сопоставления, позволяющий разработчикам работать с реляционными данными с помощью объектов, специализированных для доменов. Если вы уже использовали эту платформу для работы с данными в других приложениях .NET, можно перенести этот код в приложение UWP и он будет работать с соответствующими изменениями в строке подключения.
Чтобы испытать ее, см. раздел Начало работы с EF Core.
Библиотеке SQLite
Библиотека Microsoft.Data.Sqlite реализует интерфейсы в пространстве имен System.Data.Common. Майкрософт активно поддерживает эти реализации и предоставляет интуитивно понятную оболочку для низкоуровневых собственных API-интерфейсов SQLite.
В остальных разделах этого руководства приведены инструкции по работе с этой библиотекой.
Настройка решения для использования библиотеки Microsoft.Data.SQlite
Начнем с базового проекта UWP, а затем установим соответствующие пакеты Nuget.
Все поддерживаемые версии Windows поддерживают SQLite, поэтому приложению не нужно упаковать библиотеки SQLite. Вместо этого ваше приложение может использовать версию SQLite, которая поставляется вместе с Windows. Это обеспечивает следующие преимущества.
✔️ Уменьшает размер приложения, так как не требуется скачивать двоичную библиотеку SQLite, а затем упаковывать ее в качестве части приложения.
✔️ Отсутствие необходимости в принудительной передаче новой версии вашего приложения пользователям, если SQLite опубликует важные исправления ошибок и уязвимостей безопасности в SQLite. Версия Windows SQLite обслуживается корпорацией Майкрософт совместно с SQLite.org.
✔️ Загрузка приложения может быть быстрее, так как, скорее всего, версия SDK-пакета SQLite будет уже загружена в память.
Начнем с добавления класса в проект UWP с именем DataAccess. Вы можете использовать проект библиотеки классов .NET Standard для хранения кода доступа к данным, но мы не будем использовать его в нашем примере.
Щелкните правой кнопкой мыши решение, а затем нажмите кнопку Управление пакетами NuGet для решения.
На этом этапе у вас есть выбор. Можно использовать версию SQLite, которая входит в состав Windows, или если по какой-либо причине вы хотите использовать конкретную версию SQLite, можно добавить библиотеку SQLite в пакет. Мы будем использовать версию SQLite, которая входит в состав Windows.
Перейдите на вкладку "Обзор ", найдите пакет Microsoft.Data.SQLite.Core и установите последнюю стабильную версию.
Добавление данных в базу данных SQLite и их извлечение
Мы выполним следующие действия.
1️⃣ Подготовка класса доступа к данным.
2️⃣ Инициализация базы данных SQLite.
3️⃣ Вставка данных в базу данных SQLite.
4️⃣ Извлечение данных из базы данных SQLite.
5️⃣ Добавление базового пользовательского интерфейса.
Подготовка класса доступа к данным
DataAccess
Откройте класс в проекте и сделайте этот класс статическим.
Примечание.
В нашем примере мы размещаем код доступа к данным в статическом классе, однако это лишь проектное решение, которое не является обязательным.
public static class DataAccess
{
}
Добавьте следующие операторы использования в начало этого файла.
using Microsoft.Data.Sqlite;
using System.Collections.Generic;
Инициализация базы данных SQLite
Добавьте метод в DataAccess
класс, который инициализирует базу данных SQLite.
public async static void InitializeDatabase()
{
await ApplicationData.Current.LocalFolder.CreateFileAsync("sqliteSample.db", CreationCollisionOption.OpenIfExists);
string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
using (SqliteConnection db =
new SqliteConnection($"Filename={dbpath}"))
{
db.Open();
String tableCommand = "CREATE TABLE IF NOT " +
"EXISTS MyTable (Primary_Key INTEGER PRIMARY KEY, " +
"Text_Entry NVARCHAR(2048) NULL)";
SqliteCommand createTable = new SqliteCommand(tableCommand, db);
createTable.ExecuteReader();
}
}
Этот код создает базу данных SQLite и сохраняет ее в локальном хранилище данных приложения.
В этом примере мы используем имя базы данных sqlliteSample.db
, но вы можете использовать любое имя при условии, что оно будет использоваться во всех объектах SqliteConnection, экземпляры которых необходимо создать.
В конструкторе файла App.xaml.cs проекта UWP вызовите InitializeDatabase
метод DataAccess
класса.
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
DataAccess.InitializeDatabase();
}
Вставка данных в базу данных SQLite
Добавьте метод в DataAccess
класс, который вставляет данные в базу данных SQLite. Этот код использует параметры в запросе для предотвращения атак путем внедрения кода SQL.
public static void AddData(string inputText)
{
string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
using (SqliteConnection db =
new SqliteConnection($"Filename={dbpath}"))
{
db.Open();
SqliteCommand insertCommand = new SqliteCommand();
insertCommand.Connection = db;
// Use parameterized query to prevent SQL injection attacks
insertCommand.CommandText = "INSERT INTO MyTable VALUES (NULL, @Entry);";
insertCommand.Parameters.AddWithValue("@Entry", inputText);
insertCommand.ExecuteReader();
}
}
Извлечение данных из базы данных SQLite
Добавьте метод, который возвращает строки данных из базы данных SQLite.
public static List<String> GetData()
{
List<String> entries = new List<string>();
string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
using (SqliteConnection db =
new SqliteConnection($"Filename={dbpath}"))
{
db.Open();
SqliteCommand selectCommand = new SqliteCommand
("SELECT Text_Entry from MyTable", db);
SqliteDataReader query = selectCommand.ExecuteReader();
while (query.Read())
{
entries.Add(query.GetString(0));
}
}
return entries;
}
Метод Read считывает строки возвращаемых данных. Возвращается true
, если есть строки слева, в противном случае возвращается false
.
Метод GetString возвращает значение конкретного столбца в виде строки. Он принимает целое число, представляющее собой отсчитываемый от нуля порядковый номер столбца необходимых данных. Можно использовать похожие методы, такие как GetDataTime и GetBoolean . Выберите метод в зависимости от типа данных в столбце.
Порядковый номер параметра не так важен в этом примере, так как мы выбираем все записи в одном столбце. Тем не менее, если несколько столбцов являются частью запроса, используйте порядковое значение для получения столбца, из которого требуется извлечь данные.
Добавление базового пользовательского интерфейса
В файл MainPage.xaml проекта UWP добавьте следующий XAML-код.
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel>
<TextBox Name="Input_Box"></TextBox>
<Button Click="AddData">Add</Button>
<ListView Name="Output">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Grid>
Этот базовый пользовательский интерфейс предоставляет пользователю поле TextBox
, которое можно использовать для ввода строки, которую мы добавим в базу данных SQLite. Мы подключимся Button
в этом пользовательском интерфейсе к обработчику событий, который будет получать данные из базы данных SQLite и затем отображать их в ListView
.
В файл MainPage.xaml.cs добавьте следующий обработчик. Это метод, который мы связали с кнопкой Click
событие Button
в пользовательском интерфейсе.
private void AddData(object sender, RoutedEventArgs e)
{
DataAccess.AddData(Input_Box.Text);
Output.ItemsSource = DataAccess.GetData();
}
Мы также хотим убедиться, что все существующие данные загружаются при запуске приложения. Добавьте строку кода в MainPage
конструктор для вызова GetData()
.
public MainPage()
{
this.InitializeComponent();
Output.ItemsSource = DataAccess.GetData();
}
Вот и все. Изучите Microsoft.Data.Sqlite чтобы узнать, что еще можно сделать с вашей базой данных SQLite. Перейдите по ссылкам ниже, чтобы узнать о других способах использования данных в приложении UWP.
Следующие шаги
Подключение приложения непосредственно к базе данных SQL Server
Ознакомьтесь с разделом Использование базы данных SQL Server в приложении UWP.
Совместное использование кода между разными приложениями на различных платформах
См. статью о совместном использовании кода в классическом приложении и приложении UWP.
Добавление страниц с основными и подробными данными с помощью серверов Azure SQL
См. статью Customer Orders Database sample (Пример базы данных заказов клиентов).