Упражнение. Локальное хранение данных с помощью 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.
Открытие решения для начала работы
Клонируйте или скачайте репозиторий упражнения.
Примечание.
Рекомендуется клонировать содержимое упражнения в короткий путь к папке, например C:\dev, чтобы избежать превышения максимальной длины пути сборки.
Используйте Visual Studio, чтобы открыть решение People.sln, которое вы найдете в mslearn-dotnetmaui-store-local-data>People или начальной папке в Visual Studio Code.
Примечание.
Не пытайтесь запустить приложение только что, код не будет неполным и будет вызывать исключения, пока вы не добавите отсутствующие элементы позже в этом упражнении.
Определение сущности SQLite
Откройте файл Person.cs в папке Models.
Добавьте свойство,
int
вызываемоеId
вPerson
класс.string
Добавьте свойство с именемName
. Класс должен выглядеть следующим образом:namespace People.Models; public class Person { public int Id { get; set; } public string Name { get; set; } }
Сохраните файл Person.cs .
Добавление библиотеки SQLite
Щелкните правой кнопкой мыши узел проекта People в обозревателе решений в Visual Studio.
В появившемся контекстном меню выберите "Управление пакетами NuGet".
Найдите и выберите sqlite-net-pcl, а затем нажмите кнопку "Установить".
При использовании Visual Studio Code откройте терминал и эти пакеты с помощью следующих команд:
dotnet add package sqlite-net-pcl
Добавление атрибутов SQLite
В файле Person.cs добавьте директиву
using
дляSQLite
пространства имен в файл дляPerson
класса. Эта директива позволяет использовать атрибуты SQLite.using SQLite; namespace People.Models; public class Person { ... }
Заметите
Person
класс атрибутом[Table]
и укажите имя таблицы какpeople
.Id
Укажите свойство в качестве первичного ключа. Заметите его с[PrimaryKey]
атрибутами и[AutoIncrement]
атрибутами.Добавьте заметки в
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; } }
Сохраните файл Person.cs .
Подключение к базе данных
Откройте исходный файл PersonRepository.cs.
Проверьте класс
PersonRepository
. Этот класс содержит неполный код скелета сTODO
маркерами, в которых вы добавляете функциональные возможности для доступа к базе данных.Добавьте директиву
using
дляSQLite
пространств имен иPeople.Models
пространств имен в файл дляPersonRepository.cs
класса.Добавьте частное
SQLiteConnection
поле с именемconn
в класс над функциейInit
.Init
В функции проверьтеconn
, не равно ли ейnull
. Если да, сразу выполните возврат.if (conn != null) return;
Таким образом, код инициализации базы данных SQLite выполняется только один раз.
Инициализировать
conn
поле для подключения к базе данных с помощью переменной_dbPath
.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>(); }
Вставка строки в базу данных
В
PersonRepository
классе найдитеAddNewPerson
метод.Чтобы вставить новый
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 }); ... } ... }
Извлечение строк из базы данных
В классе
PersonRepository
найдите методGetAllPeople
.Вызов
Init
для проверки инициализации базы данных.Используйте универсальный
Table\<T>
метод для получения всех строк в таблице. УкажитеPerson
в качестве параметра типа.ToList()
Используйте метод расширения, чтобы превратить результат вList\<Person>
коллекцию и вернуть эту коллекцию.Добавьте обработку ошибок, заключив код в блок
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>(); }
Сохраните файл PersonRepository.cs .
Интеграция репозитория в пользовательский интерфейс
Откройте файл MauiProgram.cs.
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(); }
Сохраните файл MauiProgram.cs .
Разверните App.xaml в Обозреватель решений, а затем откройте файл App.xaml.cs.
Добавьте свойство ,
static
называемое .public
PersonRepo
Это свойство содержитPersonRepository
объект дляApp
класса.Инициализировать
PersonRepo
свойство в конструкторе, добавивPersonRepository
параметр в конструктор и присвоив свойству PersonRepo значение в этом параметре. ЗавершенныйApp
класс должен выглядеть следующим образом:public partial class App : Application { public static PersonRepository PersonRepo { get; private set; } public App(PersonRepository repo) { InitializeComponent(); PersonRepo = repo; } }
Примечание.
Процесс внедрения зависимостей автоматически заполняет repo
параметр конструктором.
Тестирование приложения
Создайте решение с помощью CTRL+SHIFT+B.
После завершения сборки начните отладку с помощью F5. Когда появится пользовательский интерфейс, введите свое имя и нажмите кнопку "Добавить человека".
Выберите " Получить всех людей" и убедитесь, что появится ваше имя.
Поэкспериментируйте с добавлением дополнительных имен и получением списка сохраненных пользователей.
Вернитесь в Visual Studio или Visual Studio Code и остановите отладку с помощью shift+F5.
Перезапустите приложение и выберите "Получить всех людей". Убедитесь, что сохраненные ранее имена по-прежнему хранятся в базе данных. Закройте приложение после завершения работы.