Использование базы данных SQLite в приложении UWPUse a SQLite database in a UWP app

SQLite можно использовать для хранения и извлечения данных из упрощенной базы данных на устройстве пользователя.You can use SQLite to store and retrieve data in a light-weight database on the user's device. Это руководство содержит соответствующие инструкции.This guide shows you how.

Некоторые преимущества использования SQLite для локального хранения данныхSome benefits of using SQLite for local storage

✔️ SQLite легкая и автономная.SQLite is light-weight and self-contained. Это библиотека кода без других зависимых компонентов.It's a code library without any other dependencies. Ее не требуется настраивать.There's nothing to configure.

✔️ Тут нет сервера базы данных.There's no database server. Клиент и сервер работают в одном процессе.The client and the server run in the same process.

✔️ База данных SQLite находится в общедоступном домене, поэтому вы можете свободно использовать и распространять ее в вашем приложении.SQLite is in the public domain so you can freely use and distribute it with your app.

✔️ SQLite работает на разных платформах и архитектурах.SQLite works across platforms and architectures.

Подробнее о SQLite см. здесь.You can read more about SQLite here.

Выбор слоя абстрагированияChoose an abstraction layer

Мы рекомендуем использовать Entity Framework Core или библиотеку SQLite с открытым исходным кодом, встроенные корпорацией Майкрософт.We recommend that you use either the Entity Framework Core or the open-source SQLite library built by Microsoft.

Entity Framework CoreEntity Framework Core

Entity Framework (EF) — это объектно-реляционный модуль сопоставления, позволяющий разработчикам работать с реляционными данными с помощью объектов, специализированных для доменов.Entity Framework (EF) is an object-relational mapper that you can use to work with relational data by using domain-specific objects. Если вы уже использовали эту платформу для работы с данными в других приложениях .NET, можно перенести этот код в приложение UWP и он будет работать с соответствующими изменениями в строке подключения.If you've already used this framework to work with data in other .NET apps, you can migrate that code to a UWP app and it will work with appropriate changes to the connection string.

Чтобы опробовать эту платформу, см. раздел Начало работы с EF Core на универсальной платформе Windows (UWP) с новой базой данных.To try it out, see Getting started with EF Core on Universal Windows Platform (UWP) with a New Database.

Библиотеке SQLiteSQLite library

Библиотека Microsoft.Data.Sqlite реализует интерфейсы в пространстве имен System.Data.Common.The Microsoft.Data.Sqlite library implements the interfaces in the System.Data.Common namespace. Майкрософт активно поддерживает эти реализации и предоставляет интуитивно понятную оболочку для низкоуровневых собственных API-интерфейсов SQLite.Microsoft actively maintains these implementations, and they provide an intuitive wrapper around the low-level native SQLite API.

В остальных разделах этого руководства приведены инструкции по работе с этой библиотекой.The rest of this guide helps you to use this library.

Настройка решения для использования библиотеки Microsoft.Data.SQliteSet up your solution to use the Microsoft.Data.SQlite library

Мы начнем с базового проекта UWP, добавим библиотеку классов, а затем установим соответствующие пакеты NuGet.We'll start with a basic UWP project, add a class library, and then install the appropriate Nuget packages.

Тип библиотеки классов, добавляемой в решение, и специальные пакеты, которые вы устанавливаете, зависят от минимальной версии Windows SDK, для которого предназначено ваше приложение.The type of class library that you add to your solution, and the specific packages that you install depends on the minimum version of the Windows SDK that your app targets. Эти сведения можно найти на странице свойств проекта UWP.You can find that information in the properties page of your UWP project.

Минимальная версия Windows SDK

Используйте один из следующих разделов в зависимости от минимальной версии Windows SDK, для которого предназначен вам проект UWP.Use one of the following sections depending on the minimum version of the Windows SDK that your UWP project targets.

Минимальная версия проекта не предназначена для обновления Fall Creators UpdateThe minimum version of your project does not target the Fall Creators Update

Если вы используете Visual Studio 2015, щелкните Справка->Сведения о Microsoft Visual Studio.If you're using Visual Studio 2015, click Help->About Microsoft Visual Studio. Затем в списке установленных программ убедитесь, что версия диспетчера пакетов NuGet — 3.5 или более поздняя версия.Then in the list of installed programs, make sure that you have NuGet package manager version of 3.5 or higher. Если номер версии ниже, установите более позднюю версию NuGet. Скачать ее можно здесь.If your version number is lower than that, install a later version of NuGet here. На этой странице вы найдете все версии Nuget, перечисленные под заголовком Visual Studio 2015.On that page, you'll find all of the versions of Nuget listed beneath the Visual Studio 2015 heading.

Затем добавьте библиотеку классов в свое решение.Next, add class library to your solution. Использовать библиотеку классов для размещения вашего кода доступа к данным не требуется, но мы используем ее в нашем примере.You don't have to use a class library to contain your data access code, but we'll use one our example. Мы назовем библиотеку DataAccessLibrary, а класс в библиотеке — DataAccess.We'll name the library DataAccessLibrary and we'll name the class in the library to DataAccess.

Снимок экрана: диалоговое окно "Добавление нового проекта"с выбранным разделом "Установлено" > Visual C # > "Универсальная платформа Windows" и выделенным параметром "Библиотека классов".

Щелкните правой кнопкой мыши решение, а затем нажмите кнопку Управление пакетами NuGet для решения.Right-click the solution, and then click Manage NuGet Packages for Solution.

Снимок экрана: панель Обозревателя решений с открытым с помощью щелчка правой кнопкой проектом и выделенным параметром "Управление пакетами NuGet для решения".

Если вы используете Visual Studio 2015, выберите вкладку Установленные и убедитесь, что версия пакета Microsoft.NETCore.UniversalWindowsPlatform5.2.2 или более поздняя версия.If you're using Visual Studio 2015, Choose the Installed tab, and make sure that the version number of the Microsoft.NETCore.UniversalWindowsPlatform package is 5.2.2 or higher.

Версия .NETCore

Если это не так, обновите пакет до более новой версии.If it isn't, update the package to a newer version.

Выберите вкладку Обзор и выполните поиск пакета Microsoft.Data.SQLite.Choose the Browse tab, and search for the Microsoft.Data.SQLite package. Установите версию пакета 1.1.1 (или ниже).Install version 1.1.1 (or lower) of that package.

Снимок экрана: диалоговое окно Microsoft.Data.SQLite с отмеченным текстовым полем для версии.

Перейдите к разделу Добавление данных в базу данных SQLite и их извлечение данного руководства.Move onto the Add and retrieve data in a SQLite database section of this guide.

Минимальная версия проекта предназначена для обновления Fall Creators UpdateThe minimum version of your project targets the Fall Creators Update

Существует ряд преимуществ повышения минимальной версии проекта UWP для обновления Fall Creators Update.There's a couple of benefits to raising the minimum version of your UWP project to the Fall Creators update.

В первую очередь можно использовать библиотеки .NET Standard 2.0 вместо стандартных библиотек классов.First off, you can use .NET Standard 2.0 libraries instead of regular class libraries. Это означает, что вы можете передать свой код доступа к данным любому другому приложению на основе .NET. Например, приложениям для WPF, Windows Forms, Android, iOS или ASP.NET.That means that you can share your data access code with any other .NET-based app such as a WPF, Windows Forms, Android, iOS, or ASP.NET app.

Во-вторых, в вашем приложении нет библиотек пакетов SQLite.Secondly, your app does not have to package SQLite libraries. Вместо этого ваше приложение может использовать версию SQLite, которая поставляется вместе с Windows.Instead, your app can use the version of SQLite that comes installed with Windows. Это обеспечивает следующие преимущества.This helps you in a few ways.

✔️ Уменьшает размер приложения, поскольку не требуется скачивать двоичную библиотеку SQLite, а затем упаковывать ее в качестве части приложения.Reduces the size of your application because you don't have to download the SQLite binary, and then package it as part of your application.

✔️ Отсутствие необходимости в принудительной передаче новой версии вашего приложения пользователям, если SQLite опубликует важные исправления ошибок и уязвимостей безопасности в SQLite.Prevents you from having to push a new version of your app to users in the event that SQLite publishes critical fixes to bugs and security vulnerabilities in SQLite. Версия Windows SQLite обслуживается корпорацией Майкрософт совместно с SQLite.org.The Windows version of SQLite is maintained by Microsoft in coordination with SQLite.org.

✔️ Загрузка приложения может быть быстрее, поскольку, скорее всего, версия SDK-пакета SQLite будет уже загружена в память.App load time has the potential to be faster because most likely, the SDK version of SQLite will already be loaded into memory.

Давайте начнем с добавления библиотеки классов .NET Standard 2.0 в ваше решение.Lets start by adding a .NET Standard 2.0 class library to your solution. Использовать библиотеку классов для размещения вашего кода доступа к данным необязательно, но мы используем ее в нашем примере.It's not necessary that you use a class library to contain your data access code, but we'll use one our example. Мы назовем библиотеку DataAccessLibrary, а класс в библиотеке — DataAccess.We'll name the library DataAccessLibrary and we'll name the class in the library to DataAccess.

Снимок экрана: диалоговое окно "Добавление нового проекта"с выбранным разделом "Установлено" > Visual C # > .NET Standard и выделенным параметром "Библиотека классов".

Щелкните правой кнопкой мыши решение, а затем нажмите кнопку Управление пакетами NuGet для решения.Right-click the solution, and then click Manage NuGet Packages for Solution.

Еще один снимок экрана с панелью Обозревателя решений с открытым с помощью щелчка правой кнопкой проектом и выделенным параметром "Управление пакетами NuGet".

Примечание

Чтобы библиотека классов .NET Standard могла получить доступ к папкам приложения и ресурсам изображений приложения UWP, нужно указать в свойствах EmbeddedResource и CopyAlways.If you want your .NET Standard class library to be able to access app folders and image assets of your UWP app, you will need to mark it as EmbeddedResource and CopyAlways in its properties.

На этом этапе у вас есть выбор.At this point, you have a choice. Можно использовать версию SQLite, которая входит в состав Windows, или если по какой-либо причине вы хотите использовать конкретную версию SQLite, можно добавить библиотеку SQLite в пакет.You can use the version of SQLite that is included with Windows or if you have some reason to use a specific version of SQLite, you can include the SQLite library in your package.

Давайте начнем с использования версии SQLite, которая входит в состав Windows.Let's start with how you use the version of SQLite that included with Windows.

Чтобы использовать версию SQLite, которая устанавливается вместе с Windows, выполните следующие действия.To use the version of SQLite that is installed with Windows

Выберите вкладку Обзор и выполните поиск пакета Microsoft.Data.SQLite.core, а затем установите его.Choose the Browse tab, and search for the Microsoft.Data.SQLite.core package, and then install it.

Пакет SQLite Core

Выполните поиск пакета SQLitePCLRaw.bundle_winsqlite3, а затем установите его только в проект UWP в вашем решении.Search for the SQLitePCLRaw.bundle_winsqlite3 package, and then install it only to the UWP project in your solution.

Пакет SQLite PCL Raw

Добавление SQLite в приложениеTo include SQLite with your app

Этого делать не требуется.You don't have to do this. Но если вы хотите добавить конкретную версию SQLite в свое приложение, выберите вкладку Обзор и выполните поиск пакета Microsoft.Data.SQLite.But if you have a reason to include a specific version of SQLite with your app, choose the Browse tab, and search for the Microsoft.Data.SQLite package. Установите версию пакета 2.0 (или ниже).Install version 2.0 (or lower) of that package.

Снимок экрана: диалоговое окно Microsoft.Data.SQLite, в котором показано, что выбрана последняя стабильная версия 2.0.0.

Добавление данных в базу данных SQLite и их извлечениеAdd and retrieve data in a SQLite database

Мы выполним следующие действия.We'll do these things:

1️⃣ Подготовка класса доступа к данным.Prepare the data access class.

2️⃣ Инициализация базы данных SQLite.Initialize the SQLite database.

3️⃣ Вставка данных в базу данных SQLite.Insert data into the SQLite database.

4️⃣ Извлечение данных из базы данных SQLite.Retrieve data from the SQLite database.

5️⃣ Добавление базового пользовательского интерфейса.Add a basic user interface.

Подготовка класса доступа к даннымPrepare the data access class

В проекте UWP добавьте ссылку на проект DataAccessLibrary в своем решении.From your UWP project, add a reference to the DataAccessLibrary project in your solution.

Библиотека классов для доступа к данным

Добавьте следующий оператор using в файлы App.xaml.cs и MainPage.xaml.cs в проекте UWP.Add the following using statement to the App.xaml.cs and MainPage.xaml.cs files in your UWP project.

using DataAccessLibrary;

Откройте класс DataAccess в вашем решении DataAccessLibrary и сделайте этот класс статическим.Open the DataAccess class in your DataAccessLibrary solution and make that class static.

Примечание

В нашем примере мы размещаем код доступа к данным в статическом классе, однако это лишь проектное решение, которое не является обязательным.While our example will place data access code in a static class, it's just a design choice and is completely optional.

namespace DataAccessLibrary
{
    public static class DataAccess
    {

    }
}

Добавьте следующие операторы использования в начало этого файла.Add the following using statements to the top of this file.

using Microsoft.Data.Sqlite;
using System.Collections.Generic;

Инициализация базы данных SQLiteInitialize the SQLite database

Добавьте метод в класс DataAccess, который инициализирует базу данных SQLite.Add a method to the DataAccess class that initializes the SQLite database.

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 и сохраняет ее в локальном хранилище данных приложения.This code creates the SQLite database and stores it in the application's local data store.

В этом примере мы используем имя базы данных sqlliteSample.db, но вы можете использовать любое имя при условии, что оно будет использоваться во всех объектах SqliteConnection, экземпляры которых необходимо создать.In this example, we name the database sqlliteSample.db but you can use whatever name you want as long as you use that name in all SqliteConnection objects that you instantiate.

В конструкторе файла App.xaml.cs проекта UWP вызовите метод InitializeDatabase класса DataAccess.In the constructor of the App.xaml.cs file of your UWP project, call the InitializeDatabase method of the DataAccess class.

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;

    DataAccess.InitializeDatabase();

}

Вставка данных в базу данных SQLiteInsert data into the SQLite database

Добавьте метод в класс DataAccess, который вставляет данные в базу данных SQLite.Add a method to the DataAccess class that inserts data into the SQLite database. Этот код использует параметры в запросе для предотвращения атак путем внедрения кода SQL.This code uses parameters in the query to prevent SQL injection attacks.

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();

        db.Close();
    }

}

Извлечение данных из базы данных SQLiteRetrieve data from the SQLite database

Добавьте метод, который возвращает строки данных из базы данных SQLite.Add a method that gets rows of data from a SQLite database.

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));
        }

        db.Close();
    }

    return entries;
}

Метод Read считывает строки возвращаемых данных.The Read method advances through the rows of returned data. Он возвращает значение true, если остались строки. В противном случае он возвращает значение false .It returns true if there are rows left, otherwise it returns false.

Метод GetString возвращает значение конкретного столбца в виде строки.The GetString method returns the value of the specified column as a string. Он принимает целое число, представляющее собой отсчитываемый от нуля порядковый номер столбца необходимых данных.It accepts an integer value that represents the zero-based column ordinal of the data that you want. Можно использовать похожие методы, такие как GetDataTime и GetBoolean .You can use similar methods such as GetDataTime and GetBoolean. Выберите метод в зависимости от типа данных в столбце.Choose a method based on what type of data the column contains.

Порядковый номер параметра не так важен в этом примере, так как мы выбираем все записи в одном столбце.The ordinal parameter isn't as important in this example because we are selecting all of the entries in a single column. Тем не менее, если несколько столбцов являются частью запроса, используйте порядковое значение для получения столбца, из которого требуется извлечь данные.However, if multiple columns are part of your query, use the ordinal value to obtain the column you want to pull data from.

Добавление базового пользовательского интерфейсаAdd a basic user interface

В файл MainPage.xaml проекта UWP добавьте следующий XAML-код.In the MainPage.xaml file of the UWP project, add the following 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.This basic user interface gives the user a TextBox that they can use to type a string that we'll add to the SQLite database. Мы подключимся Buttonв этом пользовательском интерфейсе к обработчику событий, который будет получать данные из базы данных SQLite и затем отображать их в ListView.We'll connect the Button in this UI to an event handler that will retrieve data from the SQLite database and then show that data in the ListView.

В файл MainPage.xaml.cs добавьте следующий обработчик.In the MainPage.xaml.cs file, add the following handler. Это метод, который мы связали с кнопкой Click событие Button в пользовательском интерфейсе.This is the method that we associated with the Click event of the Button in the UI.

private void AddData(object sender, RoutedEventArgs e)
{
    DataAccess.AddData(Input_Box.Text);

    Output.ItemsSource = DataAccess.GetData();
}

Готово!That's it. Изучите Microsoft.Data.Sqlite чтобы узнать, что еще можно сделать с вашей базой данных SQLite.Explore the Microsoft.Data.Sqlite to see what other things you can do with your SQLite database. Перейдите по ссылкам ниже, чтобы узнать о других способах использования данных в приложении UWP.Check out the links below to learn about other ways to use data in your UWP app.

Дальнейшие действияNext steps

Подключение приложения непосредственно к базе данных SQL ServerConnect your app directly to a SQL Server database

Ознакомьтесь с разделом Использование базы данных SQL Server в приложении UWP.See Use a SQL Server database in a UWP app.

Совместное использование кода между разными приложениями на различных платформахShare code between different apps across different platforms

См. статью о совместном использовании кода в классическом приложении и приложении UWP.See Share code between desktop and UWP.

Добавление страниц с основными и подробными данными с помощью серверов Azure SQLAdd master detail pages with Azure SQL back ends

См. статью Customer Orders Database sample (Пример базы данных заказов клиентов).See Customer Orders Database sample.