Статьи

Создание приложения с локальной базой данных для Windows Phone Mango

В последнее время я работал над новым приложением, списком задач (я знаю, ничего инновационного здесь -_-), но потом я прекратил работу до выхода Mango, по очень веской причине, что с Mango я могу иметь локальную базу данных для хранения и управлять структурированными данными моего приложения! Хлопать в ладоши! Хлопать в ладоши!

Одной из многих новых функций, поставляемых с Windows Phone Mango, является возможность иметь локальные базы данных — базы данных Microsoft SQL Server Compact edition (SQL CE) — для ваших приложений.

База данных находится в изолированном хранилище приложения в виде файла.

Если вы не знакомы с изолированным хранилищем, я настоятельно рекомендую вам прочитать статьи «Все о изолированном хранилище WP7» на веб-сайте WindowsPhone Geek .

Чтобы хранить и извлекать данные в локальной базе данных, приложение Windows Phone должно использовать LINQ to SQL.

« LINQ to SQL обеспечивает объектно-ориентированный подход к работе с данными и включает в себя объектную модель и среду выполнения. Объектная модель LINQ to SQL состоит в основном из объекта System.Data.Linq.DataContext, который действует как прокси для локальная база данных. Среда выполнения LINQ to SQL отвечает за соединение мира объектов (объекта DataContext) с миром данных (локальной базой данных). Эти отношения суммированы на следующем изображении ». MSDN

Еще одна вещь, которую нужно объяснить, — это контекст данных. Контекст данных — это объектная модель, которая представляет базу данных, каждый объект представляет собой набор объектов, использующих «простой старый объект CLR» (POCO) с атрибутами.

  • Сборка приложения

Мое приложение ToDo выглядит так:

Как видите, моя главная страница представляет собой панораму, содержащую:

* Горячий элемент списка: где вы можете найти задачи, которые будут выполнены в ближайшее время

* Списки: задачи будут отсортированы, задачи, связанные с работой, семьей и т. Д.

Другая страница — это простая страница Windows Phone, которая позволяет добавить новое задание.

В этом посте мы будем работать с этим пользовательским интерфейсом. Теперь вы должны знать, как создать новое приложение Windows Phone 7.1 и как добавлять страницы, поэтому все, что мне нужно сделать, это показать вам код XAML:

    <Grid x:Name=”ContentPanel” Grid.Row=”1″ Margin=”12,0″>
                <TextBlock Height=”50″ HorizontalAlignment=”Left” Margin=”10,25,0,0″ Name=”textBlock1″ Text=”Subject:” VerticalAlignment=”Top” Width=”117″ />
                <TextBox Height=”66″ HorizontalAlignment=”Left” Margin=”105,9,0,0″ Name=”textBox1″ Text=”" VerticalAlignment=”Top” Width=”342″ />
                <TextBlock Height=”43″ HorizontalAlignment=”Left” Margin=”10,97,0,0″ Name=”textBlock2″ Text=”Category:” VerticalAlignment=”Top” Width=”103″ />
                <Canvas HorizontalAlignment=”Left” VerticalAlignment=”Top” Width=”345″ Height=”66″ Margin=”111,80,0,0″>
                    <toolkit:ContextMenuService.ContextMenu>
                        <toolkit:ContextMenu>
                            <toolkit:MenuItem Header=”pin to start menu” Click=”MenuItem_Click” Tag=”START_MENU” />
                            <toolkit:MenuItem Header=”delete” Click=”MenuItem_Click” Tag=”DELETE” />
                            <toolkit:MenuItem Header=”share” Click=”MenuItem_Click” Tag=”SHARE” />
                        </toolkit:ContextMenu>
                    </toolkit:ContextMenuService.ContextMenu>
                    <Rectangle Fill=”#FFF4F4F5″ Height=”47″ Stroke=”Black” Width=”319″ Canvas.Left=”6″ Canvas.Top=”6″ />
                    <TextBlock Name=”cat” TextWrapping=”Wrap” Text=” “ Foreground=”Black” Canvas.Left=”71″ Canvas.Top=”27″/>
                </Canvas>
                <TextBlock Height=”50″ HorizontalAlignment=”Left” Margin=”10,179,0,0″ Name=”textBlock3″ Text=”Priority:” VerticalAlignment=”Top” Width=”95″ />
                <RadioButton Content=”Low” Height=”76″ HorizontalAlignment=”Left” Margin=”140,156,0,0″ Name=”radioButton1″ VerticalAlignment=”Top” Width=”134″ />
                <RadioButton Content=”High” Height=”73″ HorizontalAlignment=”Right” Margin=”0,156,33,0″ Name=”radioButton2″ VerticalAlignment=”Top” Width=”126″ />
                <toolkit:DatePicker Header=”Start date:” Margin=”0,234,0,270″ />
                <toolkit:DatePicker Header=”Due date:” Margin=”0,331,0,180″ />
                <CheckBox Content=”Completed” Height=”76″ HorizontalAlignment=”Left” Margin=”6,411,0,0″ Name=”checkBox1″ VerticalAlignment=”Top” Width=”190″ />
                <toolkit:DatePicker Header=”Date completed:” Margin=”2,493,9,21″ />
            </Grid>

Теперь, когда пользовательский интерфейс готов, мы создадим контекст данных.

Первое, что нужно сделать, это добавить ссылку System.Data.Linq, чтобы иметь возможность работать с LINQ to SQL.

Затем добавьте новый класс, я назову его задачей.

    [Table]
        public class task : INotifyPropertyChanged, INotifyPropertyChanging
        {
            private string _subject;
            [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
            public string Subject
            {
                get
                {
                    return _subject;
                }
                set
                {
                    if (_subject != value)
                    {
                        NotifyPropertyChanging(“Subject”);
                        _subject = value;
                        NotifyPropertyChanged(“Subject”);
                    }
                }
            }
            private string _category;
            public string Category
            {
                get
                {
                    return _category;
                }
                set
                {
                    if (_category != value)
                    {
                        NotifyPropertyChanging(“Category”);
                        _category = value;
                        NotifyPropertyChanged(“Category”);
                    }
                }
            }
            private bool _completed;
            [Column]
            public bool Completed
            {
                get
                {
                    return _completed;
                }
                set
                {
                    if (_completed != value)
                    {
                        NotifyPropertyChanging(“Completed”);
                        _completed = value;
                        NotifyPropertyChanged(“Completed”);
                    }
                }
            }
            private bool _priority;
            [Column]
            public bool Priority
            {
                get
                {
                    return _priority;
                }
                set
                {
                    if (_priority != value)
                    {
                        NotifyPropertyChanging(“Priority”);
                        _priority = value;
                        NotifyPropertyChanged(“Priority”);
                    }
                }
            }
            private DateTime _startDate;
            [Column]
            public DateTime StartDate
            {
                get
                {
                    return _startDate;
                }
                set
                {
                    if (_startDate != value)
                    {
                        NotifyPropertyChanging(“StartDate”);
                        _startDate = value;
                        NotifyPropertyChanged(“StartDate”);
                    }
                }
            }
            private DateTime _dueDate;
            [Column]
            public DateTime DuetDate
            {
                get
                {
                    return _dueDate;
                }
                set
                {
                    if (_dueDate != value)
                    {
                        NotifyPropertyChanging(“DuetDate”);
                        _dueDate = value;
                        NotifyPropertyChanged(“DuetDate”);
                    }
                }
            }
            private DateTime _dateCompleted;
            [Column]
            public DateTime DateCompleted
            {
                get
                {
                    return _dateCompleted;
                }
                set
                {
                    if (_dateCompleted != value)
                    {
                        NotifyPropertyChanging(“DateCompleted”);
                        _dateCompleted = value;
                        NotifyPropertyChanged(“DateCompleted”);
                    }
                }
            }
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
            public event PropertyChangingEventHandler PropertyChanging;
            private void NotifyPropertyChanging(string propertyName)
            {
                if (PropertyChanging != null)
                {
                    PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
                }
            }
        }

Добавьте еще один класс с именем TaskDataContext, который наследуется от DataContext:

    namespace task
    {
        public class TaskDataContext: DataContext
        {
            public TaskDataContext(string connectionString): base(connectionString)    {    }
            public Table<task> tasks { get { return this.GetTable<task>(); } }
        }
    }

Обратите внимание, что мы должны проверить, существует ли база данных, если нет, нам нужно ее создать.

В MainPage.xaml.cs добавьте следующий код:

    using (TaskDataContext context = new TaskDataContext(connectionString))
                {
                    if (!context.DatabaseExists())
                    {
                    context.CreateDatabase();
                    }
                }

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

В следующем посте мы узнаем, как запрашивать базу данных. Оставайтесь в курсе!