Работа с SQLite. Часть 2

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

Возьмем проект из прошлой темы и добавим в него страницы и логику для манипуляции объектами из пользовательского интерфейса.

Для начала надо определить логику создания таблицы и определения подключения. Для этого перейдем в файл App.xaml.cs и изменим его конструктор следующим образом:

public static BookRepository repo;
public App()
{
    this.InitializeComponent();
    this.Suspending += this.OnSuspending;

    repo = new BookRepository("library.db");
    repo.CreateTable();
}

С помощью статической переменной BookRepository repo мы будем обращаться к базе данных из любого места в приложении. В самом конструкторе создается бд library.db (если она отсутствует), а также таблица Book.

У нас уже есть стандартная страница MainPage.xaml. Пусть она будет выводить список книг. Определим в ней следующий код xaml:

<Page
    x:Class="SQLLiteApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:SQLLiteApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid>
        <StackPanel>
            <TextBlock Text="Библиотека" Style="{ThemeResource HeaderTextBlockStyle}" />
            <ListView x:Name="booksList" IsItemClickEnabled="True" 
                      ItemClick="ItemView_ItemClick">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Name}"  FontSize="26" />
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            <Button x:Name="createButton" Content="Добавить" Click="createButton_Click" />
        </StackPanel>
    </Grid>
</Page>

Элементу ListView задается шаблон для отображения связанных данных. По нажатию на каждый объект в списке выполняется обработчик ItemView_ItemClick. Также имеется кнопка для создания новых объектов.

А в файле кода MainPage.xaml.cs изменим код метода OnNavigatedTo и добавим обработчики:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    booksList.ItemsSource = App.repo.GetBooks();
}
private void ItemView_ItemClick(object sender, ItemClickEventArgs e)
{
    var itemId = ((Book)e.ClickedItem).Id;
    Frame.Navigate(typeof(DetailsPage), itemId);
}
private void createButton_Click(object sender, RoutedEventArgs e)
{
    Frame.Navigate(typeof(AddPage));
} 

Метод OnNavigatedTo(), срабатывающий при переходе на страницу, будет загружать в список данные. Обработчик ItemView_ItemClick() будет по нажатию на элемент списка передавать id объекта на страницу DetailsPage, которую сейчас создадим. А метод createButton_Click() будет переходить на страницу создания объекта AddPage.

Теперь добавим в проект новую страницу по типу Blank Page и назовем ее AddPage.xaml. Определим в ней следующую разметку:

<Page
    x:Class="SQLLiteApp.AddPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:SQLLiteApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid>
        <StackPanel>
            <TextBlock Text="Новый элемент" Style="{ThemeResource HeaderTextBlockStyle}" />
            <TextBox x:Name="nameBox" PlaceholderText="Название" />
            <TextBox x:Name="authorBox" PlaceholderText="Автор" />
            <TextBox x:Name="yearBox" PlaceholderText="Год" />
            <Button x:Name="addButton" Content="Добавить" Click="addButton_Click" />
        </StackPanel>
    </Grid>
</Page>

Здесь определены поля для заполнения. По клику на кнопку срабатывает обработчик addButton_Click. Добавим для него код в файл AddPage.xaml.cs:

private void addButton_Click(object sender, RoutedEventArgs e)
{
    long year = -1;
    if(Int64.TryParse(yearBox.Text,out year) && !String.IsNullOrWhiteSpace(nameBox.Text) 
        && !String.IsNullOrWhiteSpace(authorBox.Text))
    {
        Book book = new Book { Name = nameBox.Text, Author = authorBox.Text, Year = year };
        App.repo.Insert(book);
        if (Frame.CanGoBack)
            Frame.GoBack();
    }
}

Вначале проверяем поля, потом создаем объект Book и добавляем его в базу данных. В конце возвращаемся на предыдущую страницу.

И также добавим в проект новую станицу DetailsPage.xaml, которая будет выводить данные об объекте:

<Page
    x:Class="SQLLiteApp.DetailsPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:SQLLiteApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid x:Name="detailsGrid">
        <StackPanel>
            <TextBlock Text="О книге" Style="{ThemeResource HeaderTextBlockStyle}" />
            <TextBlock Text="Название" FontSize="21" Foreground="Silver" />
            <TextBlock x:Name="nameBlock" FontSize="25" />
            <TextBlock Text="Автор" FontSize="21" Foreground="Silver"/>
            <TextBlock x:Name="authorBlock" FontSize="25" />
            <TextBlock Text="Год" FontSize="21" Foreground="Silver"/>
            <TextBlock x:Name="yearBlock" FontSize="25" />
            <StackPanel Orientation="Horizontal">
                <Button Content="Назад" Click="Button_Click" />
                <Button x:Name="deleteButton" Content="Удалить" Click="Button_Click" IsEnabled="False" />
            </StackPanel>
            
        </StackPanel>
    </Grid>
</Page>

Здесь определены поля для отображения свойств объекта, а также две кнопки - для удаления и для возвращения назад. И в файл кода добавим обработчик для этих кнопок и изменим метод OnNavigatedTo():

public long Id { get; set; }

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (e.Parameter != null)
    {
        long id = (long)e.Parameter;
        Book b = App.repo.GetBook(id);
        if(b!=null)
        {
            nameBlock.Text = b.Name;
            authorBlock.Text = b.Author;
            yearBlock.Text = b.Year.ToString();
            deleteButton.IsEnabled = true;
            Id = id;
        }
    }    
}
private void Button_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    if(button.Name=="deleteButton")
        App.repo.Delete(Id);
    if (Frame.CanGoBack)
        Frame.GoBack();
}

При переходе с главной страницы на DetailsPage в нее будет передаваться id выбранного объекта. Это id будет храниться в свойстве public long Id. По id получаем объект из бд и выводим все значения его свойств на страницу.

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

При запуске приложения на главной странице будут отображаться все объекты из базы данных:

Перейдем на страницу добавления и добавим ряд объектов:

При нажатии на один объект из списка откроется страница с детальной информацией об объекте, где мы можем также его удалить.

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