В прошлой теме был создан и настроен проект, а также модель Friend и контекст данных для работы с SQLite в Xamarin Forms через Entity Framework Core. Теперь определим простейший CRUD-интерфейс.
Вначале изменим в главном проекте класс App в файле App.xaml.cs:
using System; using Xamarin.Forms; using Xamarin.Forms.Xaml; using System.Linq; namespace EFCoreApp { public partial class App : Application { public const string DBFILENAME = "friendsapp.db"; public App() { InitializeComponent(); string dbPath = DependencyService.Get<IPath>().GetDatabasePath(DBFILENAME); using (var db = new ApplicationContext(dbPath)) { // Создаем бд, если она отсутствует db.Database.EnsureCreated(); if(db.Friends.Count() == 0) { db.Friends.Add(new Friend { Name = "Tom", Email = "tom@gmail.com", Phone = "+1234567" }); db.Friends.Add(new Friend { Name = "Alice", Email = "alice@gmail.com", Phone = "+3435957" }); db.SaveChanges(); } } MainPage = new NavigationPage(new MainPage()); } protected override void OnStart () { } protected override void OnSleep () { } protected override void OnResume () { } } }
В классе App устанавливается название базы данных в виде константы DBFILENAME. В конструкторе класса мы получаем путь к базе данных и затем с помощью контекста данных создаем базу данных, если она отсутствует, и наполняем ее некоторыми начальными данными (если они отсутствуют).
Далее добавим в главный проект новую страницу FriendPage.xaml, которая будет отвечать за работу с отдельным объект Friend. В коде FriendPage.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="EFCoreApp.FriendPage" Title="Информация о друге"> <StackLayout> <Label Text="Имя" /> <Entry Text="{Binding Name}" /> <Label Text="Email" /> <Entry Text="{Binding Email}" /> <Label Text="Телефон" /> <Entry Text="{Binding Phone}" /> <StackLayout Orientation="Horizontal"> <Button Text="Сохранить" Clicked="SaveFriend" /> <Button Text="Удалить" Clicked="DeleteFriend" /> </StackLayout> </StackLayout> </ContentPage>
Здесь определены три поля ввода для трех свойств объекта Friend, а также две кнопки для различных действий. В файле FriendPage.xaml.cs определим обработчики для этих кнопок:
using System; using Xamarin.Forms; using Xamarin.Forms.Xaml; namespace EFCoreApp { [XamlCompilation(XamlCompilationOptions.Compile)] public partial class FriendPage : ContentPage { string dbPath; public FriendPage() { InitializeComponent (); dbPath = DependencyService.Get<IPath>().GetDatabasePath(App.DBFILENAME); } private void SaveFriend(object sender, EventArgs e) { var friend = (Friend)BindingContext; if (!String.IsNullOrEmpty(friend.Name)) { using (ApplicationContext db = new ApplicationContext(dbPath)) { if (friend.Id == 0) db.Friends.Add(friend); else { db.Friends.Update(friend); } db.SaveChanges(); } } this.Navigation.PopAsync(); } private void DeleteFriend(object sender, EventArgs e) { var friend = (Friend)BindingContext; using (ApplicationContext db = new ApplicationContext(dbPath)) { db.Friends.Remove(friend); db.SaveChanges(); } this.Navigation.PopAsync(); } } }
В конструкторе класса устанавливается полный путь к базе данных. Объект Friend, с которым работает страницы, передается из вне через свойтво BindingContext. То есть объект Friend представляет контекст страницы.
Обработчик SaveFriend вызывается по нажатию на кнопку сохранения. В этом случае у нас могут быть две ситуации: добавление нового объекта
и изменение старого объекта. Чтобы идентифицировать эти ситуации, проверяем значение Id объекта Friend. Если добавление, то вызываем метод
db.Friends.Add()
, если редактирование - вызываем метод db.Friends.Update()
.
Обработчик DeleteFriend вызывается при нажатии на кнопку удаления и удаляет объект из бд с помощью метода db.Friends.Remove()
.
Также изменим код страницы 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="EFCoreApp.MainPage" Title="Список друзей"> <StackLayout> <Button Text="Добавить" Clicked="CreateFriend" /> <ListView x:Name="friendsList" ItemSelected="OnItemSelected"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <ViewCell.View> <StackLayout Orientation="Horizontal"> <Label Text="{Binding Name}" FontSize="Medium" /> </StackLayout> </ViewCell.View> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackLayout> </ContentPage>
На странице теперь размещается кнопка для добавления нового объекта и список, который выводит все объекты из базы данных.
В файле MainPage.xaml.cs определим обработчики для списка и кнопки:
using System; using System.Linq; using Xamarin.Forms; namespace EFCoreApp { public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); } protected override void OnAppearing() { string dbPath = DependencyService.Get<IPath>().GetDatabasePath(App.DBFILENAME); using (ApplicationContext db = new ApplicationContext(dbPath)) { friendsList.ItemsSource = db.Friends.ToList(); } base.OnAppearing(); } // обработка нажатия элемента в списке private async void OnItemSelected(object sender, SelectedItemChangedEventArgs e) { Friend selectedFriend = (Friend)e.SelectedItem; FriendPage friendPage = new FriendPage(); friendPage.BindingContext = selectedFriend; await Navigation.PushAsync(friendPage); } // обработка нажатия кнопки добавления private async void CreateFriend(object sender, EventArgs e) { Friend friend = new Friend(); FriendPage friendPage = new FriendPage(); friendPage.BindingContext = friend; await Navigation.PushAsync(friendPage); } } }
В методе OnAppearing()
, который вызывается при отображении страницы, загружаются все объекты Friend из базы данных и устанавливаются
в качестве источника данных для списка.
Метод CreateFriend()
, вызываемый при нажатии на кнопку добавления, создает новый объект Friend и передает его странце FriendPage через установку свойства BindingContext.
Метод OnItemSelected()
, вызываемый при выборе элемента в списке, подобным образом передает выбранный объект Friend странице FriendPage.
В итоге после запуска приложения база данных будет автоматически создана, и мы увидим в списке начальные данные. Соответственно мы можем добавить новые элементы или изменить или удалить уже имеющиеся.