Лекция 5

advertisement
Лекция 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
Download