文章目錄
- 資料庫查詢
- 更新資料
- 更改資料庫結構描述
- 資料庫安全
Windows Phone Mango編程實踐
Windows Phone Mango Programming Practice
本機資料庫
Windows Phone Mango,可以將關係資料存放區在本機資料庫中,本機資料庫作為一個檔案儲存體在應用程式的隔離儲存區 (Isolated Storage)空間。Windows Phone應用程式使用LINQ to SQL執行資料庫的所有操作。LINQ to SQL用於定義資料庫結構描述、選擇資料,並將更改儲存到資料庫檔案儲存在在隔離儲存區 (Isolated Storage)空間。LINQ to SQL是.Net架構的ORM(對象關係映射)平台的資料庫。當應用程式執行LINQ語句在運行時,它轉換為Transact - SQL對資料庫執行操作;一旦資料庫返回查詢結果,LINQ to SQL將資料轉換為應用程式物件。
LINQ to SQL提供了物件導向的方法,用於處理資料,包括物件模型和運行時。LINQ to SQL物件模型是由System.Data.Linq.DataContext對象構成,它充當Proxy 伺服器的本機資料庫。LINQ to SQL 運行時負責串連本機資料庫和應用程式的DataContext對象,。DataContext對象即資料內容包含表的對象,其中每個代表在資料庫中的表。
圖6-4 LINQ to SQL
Windows Phone Mango的應用程式使用的LINQ to SQL訪問本機資料庫,LINQ to SQL提供一個用於操作儲存在資料庫中的資料的物件導向的方法。System.Data.Linq.DataContext類串連應用程式的物件模型與資料庫中的資料。
在建立本機資料庫後,可以使用 LINQ 和資料內容使用本機資料庫。以下部分說明如何選擇、 插入、 更新和刪除資料庫中的資料。
資料庫查詢
Windows Phone使用Language-integrated Query (LINQ) (LINQ) 查詢資料庫。因為 SQL 查詢在 LINQ 中引用的對象映射到資料庫中的記錄,LINQ to SQL 有別於其他 LINQ 技術正在執行的查詢的方式。典型的 LINQ 查詢在應用程式層在記憶體中執行。LINQ to SQL 中,使用的運行庫對象關係能力與每個 LINQ 查詢以 TRANSACT-SQL 翻譯,然後直接在資料庫中執行。這樣設計在選擇大型資料庫的少數幾個記錄的查詢時效能會明顯增強。
在下面的樣本中,一個名為toDoDB的DataContext對象的 LINQ to SQL 查詢和結果放到ObservableCollection的ToDoItem對象命名的待辦事項。由於順延強制的資料庫查詢不實際執行之前的待辦事項集合進行執行個體化。
// Define query to gather all of the to-do items.
var toDoItemsInDB = from ToDoItem todo in toDoDB.ToDoItems
select todo;
// Execute query and place results into a collection.
ToDoItems = new ObservableCollection<ToDoItem>(toDoItemsInDB);
插入資料
將資料插入資料庫是一個兩步過程。首先將對象添加到資料內容中,然後調用SubmitChanges方法來保持資料作為資料庫中的行的資料內容。
在下面的樣本中,建立一個ToDoItem對象並添加到的待辦事項可觀察的集合和相應的資料庫表中名為toDoDB的資料內容。
// Create a new to-do item based on text box.
ToDoItem newToDo = new ToDoItem { ItemName = newToDoTextBox.Text };
// Add the to-do item to the observable collection.
ToDoItems.Add(newToDo);
// Add the to-do item to the local database.
toDoDB.ToDoItems.InsertOnSubmit(newToDo);
注意:
直到調用SubmitChanges方法的資料不會儲存到資料庫。
更新資料
更新本機資料庫中的資料有三個步驟。第一,要更新的對象資料庫中查詢。第二,修改所需的對象。最後,調用SubmitChanges方法,以將所做的更改儲存到本機資料庫。
下面的程式碼範例顯示了應用程式OnNavigatedFrom方法中調用SubmitChanges更新本機資料庫中的資料。在SubmitChanges方法調用之前,資料是不會更新至資料庫的。
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
//Call base method
base.OnNavigatedFrom(e);
//Save changes to the database
toDoDB.SubmitChanges();
}
刪除資料
刪除資料庫中的資料也包括三個步驟。首先,查詢的資料庫中刪除的對象。然後,取決於您是否要刪除一個或多個對象,調用DeleteOnSubmit或DeleteAllOnSubmit方法,分別放在掛起的刪除狀態的那些對象。最後,調用SubmitChanges方法,以將所做的更改儲存到本機資料庫。
在下面的樣本中,一個ToDoItem對象是從名為toDoDB的資料庫中刪除。因為只有一個對象將被刪除,在SubmitChanges之前調用DeleteOnSubmit方法。
//Get a handle for the to-do item bound to the button
ToDoItem toDoForDelete = button.DataContext as ToDoItem;
//Remove the to-do item from the observable collection
ToDoItems.Remove(toDoForDelete);
//Remove the to-do item from the local database
toDoDB.ToDoItems.DeleteOnSubmit(toDoForDelete);
//Save changes to the database
toDoDB.SubmitChanges();
注意:
直到調用SubmitChanges方法,是不從資料庫刪除資料。
更改資料庫結構描述
Widows Phone應用程式可能需要更改本機資料庫架構。Microsoft.Phone.Data.Linq命名空間提供了有關於資料庫結構描述更改的DatabaseSchemaUpdater類。
DatabaseSchemaUpdater類可以執行資料庫,例如,添加表、 列、 索引或協會的添加劑更改。對於更複雜的更改,需要建立一個新的資料庫,並將資料複製到新的架構。DatabaseSchemaUpdater類提供了可用於以編程方式區分您的資料庫的不同版本的DatabaseSchemaVersion屬性。
資料庫不會反映來自DatabaseSchemaUpdater對象的更新,直到調用Execute方法。當調用該方法時,所有的更改將被提交到本機資料庫作為單個事務,包括版本更新。
下面的樣本示範如何使用DatabaseSchemaUpdater類修改基於DatabaseSchemaVersion屬性的資料庫。
using (ToDoDataContext db = new ToDoDataContext(("isostore:/ToDo.sdf")))
{
//Create the database schema updater
DatabaseSchemaUpdater dbUpdate = db.CreateDatabaseSchemaUpdater();
//Get database version
int dbVersion = dbUpdate.DatabaseSchemaVersion;
//Update database as applicable
if (dbVersion < 5)
{ //Copy data from existing database to new database
MigrateDatabaseToLatestVersion();
}
else if (dbVersion == 5)
{ //Add column to existing database to match the data context
dbUpdate.AddColumn<ToDoItem>("TaskURL");
dbUpdate.DatabaseSchemaVersion = 6;
dbUpdate.Execute();
}
}
注意:
在應用程式更新過程中不會改變任何隔離儲存區 (Isolated Storage),包括本機資料庫檔案中儲存的檔案。
資料庫安全
本機資料庫提供密碼保護和加密來協助保護您的資料庫。當您使用資料庫密碼時,加密整個資料庫。
下面的樣本示範如何建立加密的資料庫。
// Create the data context, specify the database file location and password
ToDoDataContext db = new ToDoDataContext ("Data Source='isostore:/ToDo.sdf';Password='securepassword'");
// Create an encrypted database after confirming that it does not exist
if (!db.DatabaseExists()) db.CreateDatabase();
注意:
如果只有有限的非索引列需要進行加密,可通過添加到資料庫之前將資料加密,而不是加密整個資料庫來實現更好的效能。