Лекция 5 Раздел 5.1 Темы раздела 3 Windows Phone Изолированное хранилище 4 Windows Phone Программа для заметок 5 Windows Phone Поведение кнопки «сохранить» private void saveButton_Click(object sender, RoutedEventArgs e) { saveText("notes.txt", jotTextBox.Text); } 6 Windows Phone Метод saveText private void saveText(string filename, string text) { using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) { using (IsolatedStorageFileStream rawStream = isf.CreateFile(filename)) { StreamWriter writer = new StreamWriter(rawStream); writer.Write(text); writer.Close(); } } } 7 Windows Phone Класс IsolatedStorageFile private void saveText(string filename, string text) { using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) { using (IsolatedStorageFileStream rawStream = isf.CreateFile(filename)) { StreamWriter writer = new StreamWriter(rawStream); writer.Write(text); writer.Close(); } } } 8 Windows Phone Создание файла private void saveText(string filename, string text) { using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) { using (IsolatedStorageFileStream rawStream = isf.CreateFile(filename)) { StreamWriter writer = new StreamWriter(rawStream); writer.Write(text); writer.Close(); } } } 9 Windows Phone Запись данных в файл private void saveText(string filename, string text) { using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) { using (IsolatedStorageFileStream rawStream = isf.CreateFile(filename)) { StreamWriter writer = new StreamWriter(rawStream); writer.Write(text); writer.Close(); } } } 10 Windows Phone Поведение кнопки «загрузить» private void loadButton_Click(object sender, RoutedEventArgs e) { string text; if ( loadText("notes.txt", out text ) ) { notesTextBox.Text = text; } else { notesTextBox.Text = "Напишите здесь что-нибудь...."; } } 11 Windows Phone Загрузка данных из хранилища try { using (IsolatedStorageFileStream rawStream = isf.OpenFile(filename, System.IO.FileMode.Open)) { StreamReader reader = new StreamReader(rawStream); result = reader.ReadToEnd(); reader.Close(); } } catch { return false; } 12 Windows Phone Хранилище для файлов 13 Windows Phone Хранение настроек приложения 14 Windows Phone Словари для хранения настроек 15 Windows Phone Сохранение настроек private void saveText(string filename, string text) { IsolatedStorageSettings isolatedStore = IsolatedStorageSettings.ApplicationSettings; isolatedStore.Remove(filename); isolatedStore.Add(filename, text); isolatedStore.Save(); } 16 Windows Phone Сохранение данных 17 Windows Phone Чтение данных из хранилища 18 Windows Phone Загрузка данных из хранилища private bool loadText(string filename, out string result) { IsolatedStorageSettings isolatedStore = IsolatedStorageSettings.ApplicationSettings; result = ""; try { result = (string)isolatedStore[filename]; } catch { return false; } return true; } 19 Windows Phone Управление загрузкой result = ""; try { result = (string) isolatedStore[filename]; } catch { return false; } 20 Windows Phone Краткие итоги 21 Windows Phone Раздел 5.2 Темы раздела 23 Windows Phone Пример создания базы данных 24 Windows Phone Таблица Customers CustomerID Name Address BankDetails 123456 Rob 18 Pussycat Mews Nut East Bank 654322 Jim 10 Motor Drive Big Fall Bank 111111 Ethel 4 Funny Address Strange bank 25 Windows Phone Таблицы Products и Orders ProductID 1001 1002 1003 OrderID 1 2 3 ProductName Windows Phone 7 Cheese grater Boat hook CustomerID ProductID 123456 1001 111111 1002 654322 1003 Supplier Microsoft Cheese Industries John’s Dockyard Quantity 1 5 4 OrderDate 21/10/2010 10/10/2010 01/09/2010 Price 200 2 20 Status Shipped Shipped On order 26 Windows Phone Базы данных и программы 27 Windows Phone Базы данных и классы public class Customer { public int ID { get; set; } public string Name { get; set; } public string Address { get; set; } public string BankDetails { get; set; } } 28 Windows Phone Технология LINQ 29 Windows Phone Пространства имён LINQ using using using using using System.Linq; System.Data.Linq; System.Data.Linq.Mapping; System.ComponentModel; System.Collections.ObjectModel; 30 Windows Phone Создание таблицы Customers 31 Windows Phone Атрибут Table [Table] public class Customer : INotifyPropertyChanged, INotifyPropertyChanging { // здесь описывается структура класса } 32 Windows Phone События изменения данных [Table] public class Customer : INotifyPropertyChanged, INotifyPropertyChanging { // здесь описывается структура класса } 33 Windows Phone Секции get и set в свойствах private string nameValue; public string Name { get { return nameValue; } set { // код секции set } } 34 Windows Phone Код секции set set { if (PropertyChanging != null) { PropertyChanging(this, new PropertyChangingEventArgs("Name")); } nameValue = value; If (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("Name")); } } 35 Windows Phone Создание столбцов [Column] public string Name { // здесь описывается код свойства Name } 36 Windows Phone Первичный ключ 37 Windows Phone Первичный ключ [Column(IsPrimaryKey = true, IsDbGenerated = true)] public int CustomerID { get; set; } 38 Windows Phone Контекст данных LINQ 39 Windows Phone Создание класса SalesDB public class SalesDB : DataContext { public Table<Customer> Customers; public SalesDB(string connection) : base(connection) { } } 40 Windows Phone Строка подключения 41 Windows Phone Создание тестовой базы данных public static void MakeTestDB(string connection) { SalesDB newDB = new SalesDB(connection); if (newDB.DatabaseExists()) { newDB.DeleteDatabase(); } // записать необходимые данные newDB.SubmitChanges(); } 42 Windows Phone Создание тестовых данных string[] firstNames = new string[] { "Rob", "Jim", "Joe", "Nigel", "Sally", "Tim" }; string[] lastsNames = new string[] { "Smith", "Jones", "Bloggs", "Miles", "Wilkinson" }; foreach (string lastName in lastsNames) { foreach (string firstname in firstNames) { // создание записи о клиенте } } 43 Windows Phone Создание записи о клиенте // создание записи о клиенте string name = firstname + " " + lastName; string address = name + "'s address"; string bank = name + "'s bank"; Customer newCustomer = new Customer(); newCustomer.Name = name; newCustomer.Address = address; newCustomer.BankDetails = bank; newDB.CustomerTable.InsertOnSubmit(newCustomer); 44 Windows Phone Переменные базы данных #region Sales Manager variables public SalesDB ActiveDB; public Customer ActiveCustomer; #endregion 45 Windows Phone Настройка приложения public App() { // создание тестовой базы данных SalesDB.MakeTestDB( "Data Source=isostore:/Sample.sdf"); // подключение к базе данных ActiveDB = new SalesDB( "Data Source=isostore:/Sample.sdf"); } 46 Windows Phone Создание запроса LINQ var customers = from Customer customer in thisApp.ActiveDB.CustomerTable select customer; 47 Windows Phone Создание запроса LINQ var customers = from Customer customer in thisApp.ActiveDB.CustomerTable select customer; 48 Windows Phone Вывод результатов на экран customerList.ItemsSource = customers; 49 Windows Phone Добавление условий выборки var customers = from Customer customer in thisApp.ActiveDB.CustomerTable where customer.Name.StartsWith("S") select customer; 50 Windows Phone Краткие итоги 51 Windows Phone Раздел 5.3 Темы раздела 53 Windows Phone Структура базы данных CustomerID Order ID Name Address BankDetails 123456 Rob 18 Pussycat Mews Nut East Bank 654322 Jim 10 Motor Drive Big Fall Bank 111111 Ethel 4 Funny Address Strange bank CustomerID ProductID 1 2 3 123456 111111 654322 1001 1002 1003 ProductID 1001 1002 1003 Quantity OrderDate Status 1 21/10/2010Shipped 5 10/10/2010Shipped 4 01/09/2010On order ProductName Windows Phone 7 Cheese grater Boat hook Supplier Microsoft Cheese Industries John’s Dockyard Price 200 2 20 54 Windows Phone Создание связей в классах public class Order { public DateTime OrderDate; public int Quantity; public Customer OrderCustomer; public Product OrderProduct; } 55 Windows Phone Связь строк таблиц Customer ID Order ID Name Address Bank Details 123456 Rob 18 Pussycat Mews Nut East Bank 654322 Jim 10 Motor Drive Big Fall Bank 111111 Ethel 4 Funny Address Strange bank Customer ID Product ID 1 2 3 123456 111111 654322 1001 1002 1003 Product ID 1001 1002 1003 Quantity Order Date Status 1 21/10/2010Shipped 5 10/10/2010Shipped 4 01/09/2010On order Product Name Windows Phone 7 Cheese grater Boat hook Supplier Microsoft Cheese Industries John’s Dockyard Price 200 2 20 56 Windows Phone Связи по первичному ключу Customer ID Order ID Name Address Bank Details 123456 Rob 18 Pussycat Mews Nut East Bank 654322 Jim 10 Motor Drive Big Fall Bank 111111 Ethel 4 Funny Address Strange bank Customer ID Product ID 1 2 3 123456 111111 654322 1001 1002 1003 Product ID 1001 1002 1003 Quantity Order Date Status 1 21/10/2010Shipped 5 10/10/2010Shipped 4 01/09/2010On order Product Name Windows Phone 7 Cheese grater Boat hook Supplier Microsoft Cheese Industries John’s Dockyard Price 200 2 20 57 Windows Phone Внешние ключи 58 Windows Phone Класс EntityRef private EntityRef<Customer> orderCustomer; [Association(IsForeignKey = true, Storage = "orderCustomer")] public Customer OrderCustomer { get { return orderCustomer.Entity; } set { orderCustomer.Entity = value; } } 59 Windows Phone Класс EntityRef private EntityRef<Customer> orderCustomer; [Association(IsForeignKey = true, Storage = "orderCustomer")] public Customer OrderCustomer { get { return orderCustomer.Entity; } set { orderCustomer.Entity = value; } } 60 Windows Phone Атрибут Association private EntityRef<Customer> orderCustomer; [Association(IsForeignKey = true, Storage = "orderCustomer")] public Customer OrderCustomer { get { return orderCustomer.Entity; } set { orderCustomer.Entity = value; } } 61 Windows Phone Атрибут Association private EntityRef<Customer> orderCustomer; [Association(IsForeignKey = true, Storage = "orderCustomer")] public Customer OrderCustomer { get { return orderCustomer.Entity; } set { orderCustomer.Entity = value; } } 62 Windows Phone Атрибут Association private EntityRef<Customer> orderCustomer; [Association(IsForeignKey = true, Storage = "orderCustomer")] public Customer OrderCustomer { get { return orderCustomer.Entity; } set { orderCustomer.Entity = value; } } 63 Windows Phone Ссылка на экземпляр класса private EntityRef<Customer> orderCustomer; [Association(IsForeignKey = true, Storage = "orderCustomer")] public Customer OrderCustomer { get { return orderCustomer.Entity; } set { orderCustomer.Entity = value; } } 64 Windows Phone События изменения данных NotifyPropertyChanging("OrderCustomer"); orderCustomer.Entity = value; NotifyPropertyChanged("OrderCustomer"); 65 Windows Phone Использование ссылки EntityRef Customer newCustomer = new Customer(); Order newOrder = new Order(); newOrder.OrderCustomer = newCustomer; 66 Windows Phone Связывание клиента с заказами 67 Windows Phone Класс EntitySet private EntitySet<Order> orders = new EntitySet<Order>(); [Association(Storage="orders", ThisKey="CustomerID", OtherKey="OrderCustomerID")] public EntitySet<Order> Orders { get { return orders; } set { orders = value; } } 68 Windows Phone Класс EntitySet private EntitySet<Order> orders = new EntitySet<Order>(); [Association(Storage="orders", ThisKey="CustomerID", OtherKey="OrderCustomerID")] public EntitySet<Order> Orders { get { return orders; } set { orders = value; } } 69 Windows Phone Атрибут Association private EntitySet<Order> orders = new EntitySet<Order>(); [Association(Storage="orders", ThisKey="CustomerID", OtherKey="OrderCustomerID")] public EntitySet<Order> Orders { get { return orders; } set { orders = value; } } 70 Windows Phone Атрибут Association private EntitySet<Order> orders = new EntitySet<Order>(); [Association(Storage="orders", ThisKey="CustomerID", OtherKey="OrderCustomerID")] public EntitySet<Order> Orders { get { return orders; } set { orders = value; } } 71 Windows Phone Атрибут Association private EntitySet<Order> orders = new EntitySet<Order>(); [Association(Storage="orders", ThisKey="CustomerID", OtherKey="OrderCustomerID")] public EntitySet<Order> Orders { get { return orders; } set { orders = value; } } 72 Windows Phone Настройка связанных классов 73 Windows Phone Хранение ссылок [Column] public int OrderCustomerID; private EntityRef<Customer> orderCustomer = new EntityRef<Customer>(); 74 Windows Phone Описание ассоциации [Association(IsForeignKey = true, Storage = "orderCustomer", ThisKey = "OrderCustomerID")] 75 Windows Phone Описание ассоциации [Association(IsForeignKey = true, Storage = "orderCustomer", ThisKey = "OrderCustomerID")] 76 Windows Phone Описание ассоциации [Association(IsForeignKey = true, Storage = "orderCustomer", ThisKey = "OrderCustomerID")] 77 Windows Phone Ассоциация в классе Order public Customer OrderCustomer { get { return orderCustomer.Entity; } set { orderCustomer.Entity = value; if (value != null) OrderCustomerID = value.CustomerID; } } 78 Windows Phone Уведомления LINQ set { NotifyPropertyChanging("OrderCustomer"); orderCustomer.Entity = value; NotifyPropertyChanged("OrderCustomer"); if (value != null) OrderCustomerID = value.CustomerID; } 79 Windows Phone Использование класса EntityRow Customer newCustomer = new Customer(); Order newOrder = new Order(); newOrder.OrderCustomer = newCustomer; newCustomer.Orders.Add(newOrder); 80 Windows Phone LINQ и классы foreach (Order o in activeCustomer.Orders) { // выполнить действия с заказом } 81 Windows Phone Проектирование базы данных 82 Windows Phone Добавление таблицы OrderItem OrderItemID OrderID ProductID Quantity 1 56 1001 1 2 56 1002 5 3 12343 1003 4 83 Windows Phone Полная структура базы данных 84 Windows Phone Запросы LINQ 85 Windows Phone Простой запрос к базе данных DateTime searchDate = new DateTime(2011,8,19); var orders = from Order order in activeDB.OrderTable where order.OrderDate == searchDate select order; 86 Windows Phone Обработка результатов запроса int totalSales = 0; foreach (Order order in orders) { foreach (OrderItem item in order.OrderItems) { totalSales += item.OrderItemProduct.Price; } } 87 Windows Phone Результаты запроса LINQ 88 Windows Phone Кэширование результатов List<Order> DateOrders = orders.ToList<Order>(); 89 Windows Phone Объединение запросов 90 Windows Phone Ключевое слово join var allOrders = from Customer c in newDB.CustomerTable join Order o in newDB.OrderTable on c.CustomerID equals o.OrderCustomerID select new { c.Name, o.OrderDescription }; 91 Windows Phone Использование результатов List<String> OrderDescriptions = new List<String>(); foreach (var orderDesc in allOrders) { OrderDescriptions.Add(orderDesc.Name + " заказал: " + orderDesc.OrderDescription); } 92 Windows Phone Создание нового класса var allOrders = from Customer c in newDB.CustomerTable join Order o in newDB.OrderTable on c.CustomerID equals o.OrderCustomerID select new { c.Name, o.OrderDescription }; 93 Windows Phone Удаление элементов из таблицы ActiveDB.OrderItemTable.DeleteOnSubmit(item); 94 Windows Phone Удаление связанных объектов 95 Windows Phone Краткие итоги 96 Windows Phone