Опубликован: 01.11.2011 | Доступ: свободный | Студентов: 1424 / 63 | Оценка: 3.84 / 3.44 | Длительность: 15:38:00
Специальности: Программист
Практическая работа 23:

Создание локальной базы данных для Windows Phone

Аннотация: В новой версии операционной системы Windows Phone OS 7.1 появилась возможность хранить информацию в реляционных базах данных, которая выступает в роли изолированного контейнера приложения.

Дополнительные материалы к занятию можно скачать здесь.

Вложенные папки: LocalDataBaseSample

В новой версии операционной системы Windows Phone OS 7.1 появилась возможность хранить информацию в реляционных базах данных, которая выступает в роли изолированного контейнера приложения. Для работы с базами данных приложения Windows Phone используют операторы LINQ to SQL. С помощью LINQ to SQL можно задать схему базы данных, осуществлять извлечение данных, а также сохранять изменения в файле базы данных.

На рис. 33.1 показана связь между приложением и изолированным хранилищем. Для связи с хранилищем в приложении создается объект DataContext.

Связь между приложением и изолированным хранилищем

Рис. 33.1. Связь между приложением и изолированным хранилищем

Перед началом работы с локальной базой данных нужно учесть следующее.

LINQ to SQL используется в качестве ORM engine
Файл базы данных хранится в изолированном хранилище
Для извлечения данных используется LINQ, T-SQL не подходит
Локальная база данных в Windows Phone Mango не увеличивает объем приложения, так как является частью универсальной исполняющей машины
К проекту нужно добавить ссылку на сборку System.Data.Linq
При написании строки подключения используется специфический формат, подобный:
"Data Source='isostore:/DIRECTORY/FILE.sdf'";
        

В данной работе мы создадим базу данных, в главной таблице которой будут храниться классы позвоночных животных, а в подчиненной таблице - виды. За основу мы взяли пример, описанный на сайте Microsoft (http://msdn.microsoft.com/en-us/library/ff431744(v=vs.92).aspx), и немного его переработали.

Для работы нам потребуется новая сборка Microsoft.Phone.Controls.Toolkit.dll. Ее можно скачать по адресу: http://silverlight.codeplex.com/releases/view/60291. После инсталляции файла SilverlightforWindowsPhoneToolkit-Feb2011.msi можно узнать местонахождения файла Microsoft.Phone.Controls.Toolkit.dll следующим образом. Выполните следующую последовательность действий: Пуск -> Все программы -> Microsoft Silverlight for Windows Phone Toolkit -> Binaries. Эта сборка содержит следующие полезные компоненты:

AutoCompleteBox
ContextMenu
DatePicker
GestureService/GestureListener
ListPicker
LongListSelector
Page Transitions
PerformanceProgressBar
TiltEffect
TimePicker
ToggleSwitch
WrapPanel

Нам потребуется элемент управления ListPicker. Для успешной разработки приложения нужно скачать и установить Windows Phone SDK 7.1 Beta 2 по адресу http://create.msdn.com/en-us/home/getting_started.

В Visual Studio создаем новое приложение Silverlight for Windows Phone. Назовем его LocalDataBaseSample. В пункте Target Windows Phone Version выберите Windows Phone 7.1.

Скопируйте файл Microsoft.Phone.Controls.Toolkit.dll, описанный выше в папку вашего проекта, например, в папку …\LocalDatabaseSample\LocalDatabaseSample\Bin\Debug. Подключите сборку к проекту, выполнив следующие действия: Solution Explorer -> References -> Add Reference -> Path… -> Microsoft.Phone.Controls.Toolkit.dll.


Далее, нам потребуется подключить к проекту ссылку на сборку System.Data.Linq: Solution Explorer -> References -> Add Reference -> .Net -> System.Data.Linq -> OK.


Для нашего приложения необходимы четыре иконки: appbar.add.rest.png, appbar.cancel.rest.png, appbar.check.rest.png, appbar.delete.rest.png, расположенные по адресу:

C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.1\Icons\dark (64-х разрядные операционные системы)

C:\Program Files\Microsoft SDKs\Windows Phone\v7.1\Icons\dark (32-х разрядные операционные системы)

Создайте папку Images (Solution Explorer -> Add -> Create Folder -> Images), скопируйте туда иконки и добавьте к проекту (Solution Explorer -> Images -> Add -> Existent Item).

Откройте файл MainPage.xaml и заполните его следующим содержимым:

<phone:PhoneApplicationPage 
    x:Class="LocalDatabaseSample.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="696"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True"
    xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls">

    <phone:PhoneApplicationPage.Resources>
        <DataTemplate x:Key="AnimalListBoxItemTemplate">

            <Grid HorizontalAlignment="Stretch" Width="420">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="100" />
                </Grid.ColumnDefinitions>

                <CheckBox 
                    IsChecked="{Binding IsComplete, Mode=TwoWay}" 
                    Grid.Column="0" VerticalAlignment="Top"/>

                <TextBlock 
                    Text="{Binding ItemName}" 
                    FontSize="{StaticResource PhoneFontSizeLarge}" 
                    Grid.Column="1" Grid.ColumnSpan="2" 
                    VerticalAlignment="Top" Margin="-36, 12, 0, 0"/>

                <Button                                
                    Grid.Column="3"
                    x:Name="deleteTaskButton"
                    BorderThickness="0"                                                                  
                    Margin="0, -18, 0, 0"
                    Click="deleteTaskButton_Click">

                    <Image 
                    Source="/Images/appbar.delete.rest.png"
                    Height="75"
                    Width="75"/>

                </Button>
            </Grid>
        </DataTemplate>
    </phone:PhoneApplicationPage.Resources>

    <!--LayoutRoot is the root grid where all page content is placed.-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel contains the name of the application and page title.-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock 
                x:Name="ApplicationTitle" 
                Text="Образец локальной базы данных: зоология" 
                Style="{StaticResource PhoneTextNormalStyle}"/>
        </StackPanel>

        <!--ContentPanel - place additional content here.-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <controls:Pivot Margin="0, -36, 0, 0">

                <controls:PivotItem Header="Все">
                    <ListBox 
                        x:Name="allAnimalItemsListBox" 
                        ItemsSource="{Binding AllAnimalItems}" 
                        Margin="12, 0, 12, 0" Width="440" 
                        ItemTemplate="{StaticResource AnimalListBoxItemTemplate}" />
                </controls:PivotItem>

                <controls:PivotItem Header="Птицы">
                    <ListBox 
                        x:Name="BirdsAnimalItemsListBox" 
                        ItemsSource="{Binding BirdsAnimalItems}" 
                        Margin="12, 0, 12, 0" Width="440" 
                        ItemTemplate="{StaticResource AnimalListBoxItemTemplate}" />
                </controls:PivotItem>

                <controls:PivotItem Header="Пресмыкающиеся">
                    <ListBox 
                        x:Name="ReptilesAnimalItemsListBox" 
                        ItemsSource="{Binding ReptilesAnimalItems}" 
                        Margin="12, 0, 12, 0" Width="440" 
                        ItemTemplate="{StaticResource AnimalListBoxItemTemplate}" />
                </controls:PivotItem>

                <controls:PivotItem Header="Рыбы">
                    <ListBox
                        x:Name="FishesAnimalItemsListBox" 
                        ItemsSource="{Binding FishesAnimalItems}" 
                        Margin="12, 0, 12, 0" Width="440" 
                        ItemTemplate="{StaticResource AnimalListBoxItemTemplate}" />
                </controls:PivotItem>

            </controls:Pivot>
        </Grid>
    </Grid>

    <phone:PhoneApplicationPage.ApplicationBar>
        <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">

            <shell:ApplicationBarIconButton 
                IconUri="/Images/appbar.add.rest.png" 
                Text="add" 
                x:Name="newTaskAppBarButton" 
                Click="newTaskAppBarButton_Click"/>

        </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>

</phone:PhoneApplicationPage>
    

Откройте файл MainPage.xaml.cs и введите следующий код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

/* 
    Copyright (c) 2011 Microsoft Corporation.  All rights reserved.
    Use of this sample source code is subject to the terms of the Microsoft license 
    agreement under which you licensed this sample source code and is provided AS-IS.
    If you did not accept the terms of the license agreement, you are not authorized 
    to use this sample source code.  For the terms of the license, please see the 
    license agreement between you and Microsoft.
    
*/

// Directive for the ViewModel.
using LocalDatabaseSample.Model;

namespace LocalDatabaseSample
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();

            // Set the page DataContext property to the ViewModel.
            this.DataContext = App.ViewModel;
        }

        private void newTaskAppBarButton_Click(object sender, EventArgs e)
        {
            NavigationService.Navigate(new Uri("/NewTaskPage.xaml", UriKind.Relative));
        }


        private void deleteTaskButton_Click(object sender, RoutedEventArgs e)
        {
            // Cast the parameter as a button.
            var button = sender as Button;

            if (button != null)
            {
                // Get a handle for the Animal item bound to the button.
                AnimalItem AnimalForDelete = button.DataContext as AnimalItem;

                App.ViewModel.DeleteAnimalItem(AnimalForDelete);
            }

            // Put the focus back to the main page.
            this.Focus();
        }

        protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        {
            // Save changes to the database.
            App.ViewModel.SaveChangesToDB();
        }
    }
}
    

Добавьте файл NewTaskPage.xaml в портретной ориентации: