Упражнение. Локальное хранение данных с помощью SQLite

Завершено

В этом упражнении вы используете SQLite для локального хранения сведений с приложением. В примере сценария вы решили кэшировать данные для приложения социальных сетей, чтобы повысить скорость реагирования. В этом упражнении создается и используется локальная база данных SQLite для хранения сведений о пользователях. Файл физической базы данных сохраняется в локальном хранилище.

Этот модуль использует пакет SDK для .NET 9.0. Убедитесь, что установлен .NET 9.0, выполнив следующую команду в предпочтительном терминале команд:

dotnet --list-sdks

Выходные данные, аналогичные следующему примеру, отображаются:

8.0.100 [C:\Program Files\dotnet\sdk]
9.0.100 [C:\Program Files\dotnet\sdk]

Убедитесь, что в списке есть версия, которая начинается с цифры 9. Если ни один из них отсутствует или команда не найдена, установите последний пакет SDK для .NET 9.0.

Открытие решения для начала работы

  1. Клонируйте или скачайте репозиторий упражнения.

    Примечание.

    Рекомендуется клонировать содержимое упражнения в короткий путь к папке, например C:\dev, чтобы избежать превышения максимальной длины пути сборки.

  2. Используйте Visual Studio, чтобы открыть решение People.sln, которое вы найдете в mslearn-dotnetmaui-store-local-data>People или начальной папке в Visual Studio Code.

    Примечание.

    Не пытайтесь запустить приложение только что, код не будет неполным и будет вызывать исключения, пока вы не добавите отсутствующие элементы позже в этом упражнении.

Определение сущности SQLite

  1. Откройте файл Person.cs в папке Models.

  2. Добавьте свойство, int вызываемое Id в Person класс.

  3. string Добавьте свойство с именем Name. Класс должен выглядеть следующим образом:

    namespace People.Models;
    
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    
  4. Сохраните файл Person.cs .

Добавление библиотеки SQLite

  1. Щелкните правой кнопкой мыши узел проекта People в обозревателе решений в Visual Studio.

  2. В появившемся контекстном меню выберите "Управление пакетами NuGet".

  3. Найдите и выберите sqlite-net-pcl, а затем нажмите кнопку "Установить".

    Снимок экрана: диспетчер пакетов NuGet с выбранной библиотекой sqlite-net-pcl.

При использовании Visual Studio Code откройте терминал и эти пакеты с помощью следующих команд:

dotnet add package sqlite-net-pcl

Добавление атрибутов SQLite

  1. В файле Person.cs добавьте директиву using для SQLite пространства имен в файл для Person класса. Эта директива позволяет использовать атрибуты SQLite.

    using SQLite;
    
    namespace People.Models;
    
    public class Person
    {
        ...
    }
    
  2. Заметите Person класс атрибутом [Table] и укажите имя таблицы как people.

  3. Id Укажите свойство в качестве первичного ключа. Заметите его с [PrimaryKey] атрибутами и [AutoIncrement] атрибутами.

  4. Добавьте заметки в Name свойство. Укажите значение MaxLength 250. Укажите, что каждое значение в столбце должно быть Unique.

    Готовый класс должен выглядеть следующим образом:

    using SQLite;
    
    namespace People.Models;
    
    [Table("people")]
    public class Person
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
    
        [MaxLength(250), Unique]
        public string Name { get; set; }
    }
    
  5. Сохраните файл Person.cs .

Подключение к базе данных

  1. Откройте исходный файл PersonRepository.cs.

  2. Проверьте класс PersonRepository. Этот класс содержит неполный код скелета с TODO маркерами, в которых вы добавляете функциональные возможности для доступа к базе данных.

  3. Добавьте директиву using для SQLite пространств имен и People.Models пространств имен в файл для PersonRepository.cs класса.

  4. Добавьте частное SQLiteConnection поле с именем conn в класс над функцией Init .

  5. Init В функции проверьтеconn, не равно ли ейnull. Если да, сразу выполните возврат.

    if (conn != null)
        return;
    

    Таким образом, код инициализации базы данных SQLite выполняется только один раз.

  6. Инициализировать conn поле для подключения к базе данных с помощью переменной _dbPath .

  7. conn.CreateTable Используйте метод для создания таблицы для хранения Person данных. Готовая функция Init будет выглядеть так:

    using SQLite;
    using People.Models;
    ...
    
    private SQLiteConnection conn;
    ...
    private void Init()
    {
       if (conn != null)
          return;
    
       conn = new SQLiteConnection(_dbPath);
       conn.CreateTable<Person>();
    }
    

Вставка строки в базу данных

  1. В PersonRepository классе найдите AddNewPerson метод.

  2. Чтобы вставить новый Person объект, замените TODO комментарий в этом методе кодом. Код сначала вызывает Init проверку инициализации базы данных, а затем использует SQLiteConnection метод объекта Insert . Задайте переменной значение, result возвращаемое Insert методом, как показано в следующем коде:

    public void AddNewPerson(string name)
    {
        int result = 0;
        try
        {
            // enter this line
            Init();
    
            // basic validation to ensure a name was entered
            if (string.IsNullOrEmpty(name))
                throw new Exception("Valid name required");
    
            // enter this line
            result = conn.Insert(new Person { Name = name });
            ...
        }
        ...
    }
    

Извлечение строк из базы данных

  1. В классе PersonRepository найдите метод GetAllPeople.

  2. Вызов Init для проверки инициализации базы данных.

  3. Используйте универсальный Table\<T> метод для получения всех строк в таблице. Укажите Person в качестве параметра типа.

  4. ToList() Используйте метод расширения, чтобы превратить результат в List\<Person> коллекцию и вернуть эту коллекцию.

  5. Добавьте обработку ошибок, заключив код в блок try-catch. Если возникает ошибка, задайте StatusMessage свойство свойству исключения Message и верните пустую коллекцию. Готовый метод должен выглядеть так:

    public List<Person> GetAllPeople()
    {
       try
       {
          Init();
          return conn.Table<Person>().ToList();
       }
       catch (Exception ex)
       {
          StatusMessage = string.Format("Failed to retrieve data. {0}", ex.Message);
       }
    
       return new List<Person>();
    }
    
  6. Сохраните файл PersonRepository.cs .

Интеграция репозитория в пользовательский интерфейс

  1. Откройте файл MauiProgram.cs.

  2. CreateMauiApp В функции после инструкций, которые добавляют страницу MainPage в качестве однотонной службы в приложение, добавьте код для выполнения следующих задач:

    • Создайте строковую переменную под названием dbPath. Инициализируйте эту строку с помощью выражения FileAccessHelper.GetLocalFilePath("people.db3"). Файл базы данных, который использует приложение, называется people.db3, и приложение сохраняет этот файл в локальном хранилище на устройстве.

    • Используйте внедрение зависимостей, чтобы добавить класс PersonRepository в качестве отдельной службы в приложение. Класс PersonRepository предоставляет конструктор, который принимает путь к файлу базы данных в качестве строкового параметра.

    Полный CreateMauiApp код функции должен выглядеть следующим образом:

    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });
    
        // Add this code
        string dbPath = FileAccessHelper.GetLocalFilePath("people.db3");
        builder.Services.AddSingleton<PersonRepository>(s => ActivatorUtilities.CreateInstance<PersonRepository>(s, dbPath));
    
        return builder.Build();
    }
    
  3. Сохраните файл MauiProgram.cs .

  4. Разверните App.xaml в Обозреватель решений, а затем откройте файл App.xaml.cs.

  5. Добавьте свойство , static называемое .publicPersonRepo Это свойство содержит PersonRepository объект для App класса.

  6. Инициализировать PersonRepo свойство в конструкторе, добавив PersonRepository параметр в конструктор и присвоив свойству PersonRepo значение в этом параметре. Завершенный App класс должен выглядеть следующим образом:

    public partial class App : Application
    {
        public static PersonRepository PersonRepo { get; private set; }
    
        public App(PersonRepository repo)
        {
            InitializeComponent();
            PersonRepo = repo;
        }
    }
    

Примечание.

Процесс внедрения зависимостей автоматически заполняет repo параметр конструктором.

Тестирование приложения

  1. Создайте решение с помощью CTRL+SHIFT+B.

  2. После завершения сборки начните отладку с помощью F5. Когда появится пользовательский интерфейс, введите свое имя и нажмите кнопку "Добавить человека".

    Снимок экрана приложения с сообщением об успешном добавлении записи.

  3. Выберите " Получить всех людей" и убедитесь, что появится ваше имя.

    Снимок экрана приложения со списком всех записей в базе данных.

  4. Поэкспериментируйте с добавлением дополнительных имен и получением списка сохраненных пользователей.

  5. Вернитесь в Visual Studio или Visual Studio Code и остановите отладку с помощью shift+F5.

  6. Перезапустите приложение и выберите "Получить всех людей". Убедитесь, что сохраненные ранее имена по-прежнему хранятся в базе данных. Закройте приложение после завершения работы.