Основные операции данными

Последнее обновление: 11.01.2021

В прошлой теме был создан и настроен проект, а также модель 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.

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

База данных Sqlite и Entity Framework Core в Xamarin
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850