Основные операции с базой данных SQLite

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

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

По умолчанию у нас уже есть страница MainPage.xaml. Пусть она будет выводить список компаний, то есть объектов класса Company, а также будет содержать элементы для управления этими объектами. Итак, изменим MainPage.xaml следующим образом:

<Page
    x:Class="SQLiteApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:SQLiteApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Page.BottomAppBar>
        <CommandBar>
            <AppBarButton x:Name="saveButton" Label="Добавить" Icon="Add" Click="Add_Click" />
            <AppBarButton x:Name="editButton" Label="Изменить" Icon="Edit" Click="Edit_Click" />
            <AppBarButton x:Name="deleteButton" Label="Удалить" Icon="Delete" Click="Delete_Click" />
        </CommandBar>
    </Page.BottomAppBar>
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <ListView x:Name="companiesList">
            <ListView.ItemTemplate>
                <DataTemplate  x:DataType="local:Company">
                    <StackPanel>
                        <TextBlock Text="{Binding Name}"  FontSize="26" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>

Для отображения списка определен элемент ListView, а для управления компаниями в нижней панели определены три кнопки. Теперь в файле кода MainPage.xaml.cs определим для них обработчики нажатия:

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        this.Loaded += MainPage_Loaded;
    }

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        using (MobileContext db = new MobileContext())
        {
            companiesList.ItemsSource = db.Companies.ToList();
        }
    }

    private void Add_Click(object sender, RoutedEventArgs e)
    {
        Frame.Navigate(typeof(CompanyPage));
    }

    private void Edit_Click(object sender, RoutedEventArgs e)
    {
        // получаем выделеный пункт меню
        if (companiesList.SelectedItem != null)
        {
            Company company = companiesList.SelectedItem as Company;
            if (company != null)
                Frame.Navigate(typeof(CompanyPage), company.Id);
        }
    }

    private void Delete_Click(object sender, RoutedEventArgs e)
    {
        // получаем выделеный пункт меню
        if (companiesList.SelectedItem != null)
        {
            Company company = companiesList.SelectedItem as Company;
            if (company != null)
            {
                using (MobileContext db = new MobileContext())
                {
                    db.Companies.Remove(company);
                    db.SaveChanges();
                    companiesList.ItemsSource = db.Companies.ToList();
                }
            }
        }
    }
}

При загрузке страницы срабатывает обработчик MainPage_Loaded, в котором получаем список компаний из базы данных и устанавливаем его в качестве источника данных для ListView:

companiesList.ItemsSource = db.Companies.ToList();

Обработчик кнопки добавления Add_Click просто перенаправляет на страницу CompanyPage, которую мы чуть позже создадим.

Обработчик кнопки редактирования Edit_Click получает выделенный объект Company в списке и передает его id на страницу CompanyPage.

Обработчик кнопки удаления Delete_Click получает выделенный объект Company и передает его в метод Remove:

db.Companies.Remove(company);

Этот метод позволяет сгенерировать SQL-выражение DELETE для удаления данных из таблицы компаний. После этого надо сохранить все изменения, то есть выполнить это SQL-выражение с помощью вызова:

db.SaveChanges();

И далее переустанавливаем источник данных для ListView.

В итоге главная страница будет выглядеть примерно так:

Работа с базой данных в UWP

Для добавления/редактирования добавим новую страницу по типу BlankPage, которую назовем CompanyPage:

CRUD операции в UWP

Так как модель Company имеет по сути одно значимое свойство - Name, то много нам добавлять и редактировать не надо, и для обеих операций нам хватит одной страницы. Тем более эти операции у нас будут отличаться только наличием Id при редактировании.

Изменим начальный код страницы CompanyPage.xaml на следующий:

<Page
    x:Class="SQLiteApp.CompanyPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:SQLiteApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <StackPanel Margin="10 0 10 0">
            <TextBlock x:Name="headerBlock" Text = "Добавление компании" 
                       Style="{ThemeResource HeaderTextBlockStyle}" />
            <TextBlock>Название компании</TextBlock>
            <TextBox x:Name="nameBox" />
            <StackPanel Orientation="Horizontal">
                <Button Content="Сохранить" Click="Save_Click" Margin="10" />
                <Button Content="Отмена" Click="Cancel_Click" Margin="10" />
            </StackPanel>
        </StackPanel>
    </Grid>
</Page>

Здесь одно текстовое поле для редактирования названия компании и две кнопки: для сохранения изменений и отмены действий.

Далее изменим код C#, добавив в него обработчики кнопок:

public sealed partial class CompanyPage : Page
{
    Company company;

    public CompanyPage()
    {
        this.InitializeComponent();
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        if (e.Parameter != null)
        {
            int id = (int)e.Parameter;
            using (MobileContext db = new MobileContext())
            {
                company = db.Companies.FirstOrDefault(c => c.Id == id);
            }
        }
            
        if (company != null)
        {
            headerBlock.Text = "Редактирование компании";
            nameBox.Text = company.Name;
        }
    }

    private void Save_Click(object sender, RoutedEventArgs e)
    {
        using (MobileContext db = new MobileContext())
        {
            if(company!=null)
            {
                company.Name = nameBox.Text;
                db.Companies.Update(company);
            }
            else
            {
                db.Companies.Add(new Company { Name = nameBox.Text });
            }
            db.SaveChanges();
        }
        GoToMainPage();
    }

    private void Cancel_Click(object sender, RoutedEventArgs e)
    {
        GoToMainPage();
    }

    private void GoToMainPage()
    {
        if (Frame.CanGoBack)
            Frame.GoBack();
        else
            Frame.Navigate(typeof(MainPage));
    }
}

При переходе на страницу срабатывает метод OnNavigatedTo(). В нем мы смотрим на переданный параметр. Если он не равен null, значит, нам надо отредактировать сушность, идентификатор которой равен параметру. В ином случае надо выполнить добавление. По этому идентифкатору мы получаем компанию из бд:

company = db.Companies.FirstOrDefault(c => c.Id == id);

При нажатии на кнопку сохранения смотрим, была ли получена ранее компания. Если она была получена, значит, нам надо отредактировать ее. Для этого объект компании передается в метод Update():

db.Companies.Update(company);

Он генерирует выражение SQL UPDATE для обновления записей в базе данных.

Если же компания при загрузке страницы не была установлена, то выполняем добавление в базе данных с помощью метода Add():

db.Companies.Add(new Company { Name = nameBox.Text });

Далее выполняем сгенерированное SQL-выражение с помощью метода db.SaveChanges(). И после всех изменений возвращаемся на главную страницу.

В итоге CompanyPage будет выглядеть примерно так:

Добавление в базу данных на Universal Windows Platform

Таким образом, мы создали простейшее приложение, которое выполняет все базовые операции с данными: чтение, добавление, обновление и удаление.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850