Учебник по локальной базе данных в Xamarin.Forms
Прежде чем работать с этим учебником, вы должны выполнить:
- Краткое руководство Создание первого Xamarin.Forms приложения.
- Руководство по StackLayout.
- Руководство по Button.
- Руководство по Entry.
- Руководство по CollectionView.
В этом руководстве описано следующее:
- Использование диспетчера пакетов NuGet для добавления SQLite.NET в проект Xamarin.Forms.
- Создавать классы доступа к данным.
- Использовать классы доступа к данным.
С помощью Visual Studio 2019 или Visual Studio для Mac вы создадите простое приложение, демонстрирующее, как сохранять данные в локальной базе данных SQLite.NET. На следующих снимках экрана показано готовое приложение.
Добавление SQLite.NET
Для работы с этим руководством у вас должен быть последний выпуск Visual Studio 2019 с установленной рабочей нагрузкой Разработка мобильных приложений на .NET. Кроме того, вам потребуется компьютер Mac для сборки учебного приложения на iOS. Сведения об установке платформы Xamarin см. в статье Установка Xamarin. Сведения о подключении Visual Studio 2019 к узлу сборки Mac см. в статье Связывание с Mac при разработке для Xamarin.iOS.
Запустите Visual Studio и создайте пустое приложение Xamarin.Forms с именем LocalDatabaseTutorial.
Внимание
Для фрагментов кода на C# и XAML в этом руководстве необходимо решение с именем LocalDatabaseTutorial. Выбор другого имени приведет к ошибкам сборки при копировании кода из этого руководства в решение.
Дополнительные сведения о создаваемой библиотеке .NET Standard см. в разделе Структура приложения Xamarin.Forms статьи Подробное изучение кратких руководств по Xamarin.Forms.
В обозревателе решений выберите проект LocalDatabaseTutorial, щелкните правой кнопкой мыши и выберите Управление пакетами NuGet....
В разделе Диспетчер пакетов NuGet выберите вкладку Обзор, выполните поиск пакета NuGet sqlite-net-pcl, выберите его и нажмите кнопку Установить, чтобы добавить его в проект.
Примечание.
Существует несколько пакетов NuGet с похожими названиями. Правильный пакет имеет следующие атрибуты:
- Авторы: SQLite-net
- Ссылка NuGet: sqlite-net-pcl
Несмотря на название, этот пакет NuGet можно использовать в проектах .NET Standard.
Этот пакет будет использоваться для включения операций базы данных в приложение.
Внимание
SQLite.NET — это сторонняя библиотека, поддерживаемая репозиторием praeclarum/sqlite-net.
Соберите решение, чтобы убедиться в отсутствии ошибок.
Создание классов доступа к данным
В этом упражнении вы добавите классы доступа к данным в проект LocalDatabaseTutorial, который будет использоваться для сохранения данных о пользователях в базе данных.
В обозревателе решений в проекте LocalDatabaseTutorial добавьте новый класс с именем
Person
. Далее, удалите в Person.cs весь код шаблона и замените его приведенным ниже.using SQLite; namespace LocalDatabaseTutorial { public class Person { [PrimaryKey, AutoIncrement] public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } } }
Этот код определяет класс
Person
, в котором будут храниться данные о каждом пользователе приложения. СвойствоID
помечено атрибутамиPrimaryKey
иAutoIncrement
, чтобы каждый экземплярPerson
в базе данных имел уникальный идентификатор, предоставленный SQLite.NET.В обозревателе решений в проекте LocalDatabaseTutorial добавьте новый класс с именем
Database
. Далее, удалите в Database.cs весь код шаблона и замените его приведенным ниже.using System.Collections.Generic; using System.Threading.Tasks; using SQLite; namespace LocalDatabaseTutorial { public class Database { readonly SQLiteAsyncConnection _database; public Database(string dbPath) { _database = new SQLiteAsyncConnection(dbPath); _database.CreateTableAsync<Person>().Wait(); } public Task<List<Person>> GetPeopleAsync() { return _database.Table<Person>().ToListAsync(); } public Task<int> SavePersonAsync(Person person) { return _database.InsertAsync(person); } } }
Этот класс содержит код, чтобы создать базу данных, читать и записывать данные в ней. В коде используются асинхронные API-интерфейсы SQLite.NET, которые перемещают операции базы данных в фоновые потоки. Кроме того конструктор
Database
принимает путь файла базы данных в качестве аргумента. Этот путь будет предоставлен классомApp
в следующем упражнении.В обозревателе решений в проекте LocalDatabaseTutorial разверните App.xaml и дважды щелкните файл App.xaml.cs, чтобы открыть его. Удалите в App.xaml.cs весь код шаблона и замените его приведенным ниже кодом.
using System; using System.IO; using Xamarin.Forms; namespace LocalDatabaseTutorial { public partial class App : Application { static Database database; public static Database Database { get { if (database == null) { database = new Database(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "people.db3")); } return database; } } public App() { InitializeComponent(); MainPage = new MainPage(); } protected override void OnStart() { // Handle when your app starts } protected override void OnSleep() { // Handle when your app sleeps } protected override void OnResume() { // Handle when your app resumes } } }
Этот код определяет свойство
Database
, которое создает новый экземплярDatabase
в качестве отдельной базы данных. Локальный путь к файлу и имя файла, с помощью которых представляется место хранения базы данных, передаются в качестве аргумента конструктору классаDatabase
.Внимание
Преимущество использования отдельной базы данных в том, что создается отдельное подключение к базе данных, которое остается открытым, пока работает приложение. Это позволяет избежать затрат, связанных с открытием и закрытием файла базы данных каждый раз, когда выполняется операция с ней.
Соберите решение, чтобы убедиться в отсутствии ошибок.
Использование классов доступа к данным
В этом упражнении будет создан пользовательский интерфейс, который используется для работы с ранее созданными классами доступа к данным.
В обозревателе решений в проекте LocalDatabaseTutorial дважды щелкните MainPage.xaml, чтобы открыть его. В MainPage.xaml удалите весь код шаблона и замените его приведенным ниже кодом:
<?xml version="1.0" encoding="utf-8"?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="LocalDatabaseTutorial.MainPage"> <StackLayout Margin="20,35,20,20"> <Entry x:Name="nameEntry" Placeholder="Enter name" /> <Entry x:Name="ageEntry" Placeholder="Enter age" /> <Button Text="Add to Database" Clicked="OnButtonClicked" /> <CollectionView x:Name="collectionView"> <CollectionView.ItemTemplate> <DataTemplate> <StackLayout> <Label Text="{Binding Name}" FontSize="Medium" /> <Label Text="{Binding Age}" TextColor="Silver" FontSize="Small" /> </StackLayout> </DataTemplate> </CollectionView.ItemTemplate> </CollectionView> </StackLayout> </ContentPage>
Этот код декларативно определяет пользовательский интерфейс для страницы, который состоит из двух экземпляров
Entry
(Button
иCollectionView
) вStackLayout
. Каждый экземплярEntry
обладает собственным набором свойствPlaceholder
, которые указывают замещающий текст, который отображается перед вводом данных пользователем.Button
устанавливает событиеClicked
для обработчика событийOnButtonClicked
, который будет создан на следующем шаге.CollectionView
устанавливает для его свойстваItemTemplate
значениеDataTemplate
, которое используетStackLayout
и два объектаLabel
для определения внешнего вида каждого элемента в строкеCollectionView
. ОбъектыLabel
привязывают свои свойстваText
к свойствамName
иAge
каждого из объектовPerson
соответственно.Кроме этого экземпляры
Entry
иCollectionView
обладают именами, указанными в атрибутеx:Name
. Это позволяет файлу с выделенным кодом получать доступ к этим объектам с помощью назначенных имен.В обозревателе решений в проекте LocalDatabaseTutorial разверните узел MainPage.xaml и дважды щелкните MainPage.xaml.cs, чтобы открыть его. Затем в MainPage.xaml.cs добавьте переопределение
OnAppearing
и обработчик событийOnButtonClicked
в класс.protected override async void OnAppearing() { base.OnAppearing(); collectionView.ItemsSource = await App.Database.GetPeopleAsync(); } async void OnButtonClicked(object sender, EventArgs e) { if (!string.IsNullOrWhiteSpace(nameEntry.Text) && !string.IsNullOrWhiteSpace(ageEntry.Text)) { await App.Database.SavePersonAsync(new Person { Name = nameEntry.Text, Age = int.Parse(ageEntry.Text) }); nameEntry.Text = ageEntry.Text = string.Empty; collectionView.ItemsSource = await App.Database.GetPeopleAsync(); } }
Метод
OnAppearing
заполняетCollectionView
любыми данными, хранящимися в базе данных. МетодOnButtonClicked
, который выполняется при нажатииButton
, сохраняет введенные данные в базу данных перед очисткой обоих экземпляровEntry
и обновлением данных вCollectionView
.Примечание.
Переопределение метода
OnAppearing
выполняется после готовностиContentPage
, но только прежде чем он станет видимым. Таким образом лучше всего задать содержимое представлений Xamarin.Forms.На панели инструментов Visual Studio нажмите кнопку Пуск (треугольная кнопка, похожая на кнопку воспроизведения), чтобы запустить приложение в выбранном удаленном симуляторе iOS или эмуляторе Android.
Введите несколько элементов данных нажав
Button
для каждого из них. Это действие позволит сохранить данные в базу данных и повторно заполнитьCollectionView
всеми данными базы данных.В Visual Studio остановите приложение.
Дополнительные сведения о локальных базах данных в см. в Xamarin.Forms статье Xamarin.Forms Локальные базы данных (руководство)
Поздравляем!
Поздравляем с завершением этого учебника, где вы научились:
- Использование диспетчера пакетов NuGet для добавления SQLite.NET в проект Xamarin.Forms.
- Создавать классы доступа к данным.
- Использовать классы доступа к данным.
Следующие шаги
Чтобы узнать больше об основах создания мобильных приложений с помощью Xamarin.Forms, перейдите к учебнику по веб-службам.
Дополнительные ссылки
Возникла проблема с этим разделом? Если это так, отправьте нам отзыв, чтобы мы исправили этот раздел.