Использование базы данных 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.
Заметка
Убедитесь, что вы установили Microsoft.Data.Sqlite' package and not 'Microsoft.Data.Sqlite.Core
. Этот пакет установит Microsoft.Data.Sqlite.Core
в качестве зависимости.
Все поддерживаемые версии Windows поддерживают SQLite, поэтому приложению не нужно упаковать библиотеки SQLite. Вместо этого приложение может использовать версию SQLite, установленную с Windows. Это поможет вам несколькими способами.
✔️ Уменьшает размер приложения, так как вам не нужно скачать двоичный файл 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 в начало этого файла.
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}"))
{
SQLitePCL.Batteries.Init();
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.
Добавьте страницы главного и детального представления с серверной частью на основе SQL Azure.
См. базу данных заказов клиентов , пример.