Windows Phone OS 7.1,可以將關係資料存放區在駐留在應用程式隔離儲存區 (Isolated Storage)容器的本機資料庫中。Windows Phone 應用程式使用 LINQ to SQL 執行所有資料庫操作;LINQ to SQL 用於定義資料庫結構描述、選擇資料,並將更改儲存到駐留在隔離儲存區 (Isolated Storage)中的基礎資料庫檔案;提到LINQ to SQL,你會不會感到欣喜,It’s amazing在window phone裡我們居然可以這樣來持久化資料 :),本文將帶領大家一同建立第一個windows phone本機資料庫應用--連絡人管理。
本系列包括以下:
1.資料庫建立
2.從隔離儲存區 (Isolated Storage)中找到資料庫檔案並copy到pc上
3.複用2中的資料庫(其他程式使用2中的資料庫檔案或者使用2中初始的資料)
前一篇我們已經將資料庫物理檔案copy到了pc檔案目錄裡了,而我們這麼做的最終目的當然是複用或者在其他應用裡引用這個資料庫,因為它現在已經有物理結構還有我們初始化的資料,我們在這裡可以稱之為內建資料了,因為其他應用引用這個資料庫時,可以直接讀取到它現在裡面的資料,當然可以進行增刪改查;好了,let’s go.
1.首先在解決方案裡建立一個新的windows phone程式,Demo裡為MangoDataBaseTest
2.將之前的ContactorDataContext.cs檔案複製到MangoDataBaseTest項目(包括類:ContactorDataContext,DataBaseManager,還有其他的Model),因為它們負責ORMapping,以及資料庫的管理;
3.將上一篇中我們匯出的MyContactor.sdf檔案複製到MangoDataBaseTest項目裡,屬性中的產生設定為“內容”,複製設定為“始終複製”
設定這些後當部署本機資料庫時,資料庫物理檔案將儲存在部署後的安裝資料夾中。安裝資料夾為唯讀。主應用程式可以通過唯讀方式串連到該資料庫,或將其複製到隔離儲存區 (Isolated Storage)以進行讀寫操作;當然我們的Demo對資料庫不能是唯讀操作,所以我們需要把資料庫物理檔案移動到隔離儲存區 (Isolated Storage)中去,當然這個要在程式裡實現;
當然如果要以唯讀方式串連到資料庫DataContext需要這樣串連:
ContactorDataContext db = new ContactorDataContext("Data Source = 'appdata:/Resources/MyContactor.sdf'; File Mode = read only;");
tips:在檔案路徑中使用 appdata 首碼來區分安裝資料夾 (appdata) 中的路徑和隔離儲存區 (Isolated Storage) (isostore) 中的路徑;若沒有首碼,則資料內容將應用隔離儲存區 (Isolated Storage)的路徑
下面Demo是採用複製資料庫檔案到隔離儲存區 (Isolated Storage)中的方法;
4.將資料庫物理檔案複製到隔離儲存區 (Isolated Storage)中
在DataBaseManager中添加如下方法:
/// <summary>
/// 將資料庫檔案複製到隔離儲存區 (Isolated Storage)
/// </summary>
public static void MoveReferenceDatabase()
{
//隔離儲存區 (Isolated Storage)中是否已經存在資料庫檔案
bool isExists = DataBaseManager.Exists();
if (!isExists)//隔離儲存區 (Isolated Storage)中不存在資料庫檔案則執行複製
{
//將資料庫檔案移動到隔離儲存區 (Isolated Storage),方便讀寫
IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication();
using (Stream input = Application.GetResourceStream(new Uri("Resources/MyContactor.sdf", UriKind.Relative)).Stream)
{
using (IsolatedStorageFileStream output = iso.CreateFile("MyContactor.sdf"))
{
byte[] readBuffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = input.Read(readBuffer, 0, readBuffer.Length)) > 0)
{
output.Write(readBuffer, 0, bytesRead);
}
}
}
}
}
/// <summary>
/// 是否存在資料庫檔案
/// </summary>
/// <returns></returns>
public static bool Exists()
{
bool isExists = false;
using (ContactorDataContext db = new ContactorDataContext(DBConnectionString))
{
isExists = db.DatabaseExists();
}
return isExists;
}
在App.xaml.cs中的建構函式中調用:
5.ui則可以直接複製MangoDataBaseDemo項目裡的main.xaml、MainViewModel也可以直接複製,現在MangoDataBaseTest項目功能和MangoDataBaseDemo一樣,但是MangoDataBaseTest卻是使用我們引用的物理資料庫檔案MyContactor.sdf,不僅有已內建的資料,我們也可以進行增刪改查..
運行MangoDataBaseTest..
添加資料:
現在我們正式完成對資料庫物理檔案的引用了..
回顧:此mango中使用資料庫主要包括
1>在window phone中使用資料庫可以有的選擇;以及mango中支援linq to sql的資料庫操作來建庫、建表、建索引;通過建立一個簡單的通訊錄和分組,並驗證了資料庫的建立流程;詳細
2>通過使用window phoen sdk中的ISETool.EXE來管理調試裝置(模擬器或者測試機)應用隔離儲存區 (Isolated Storage)中的檔案和資源,它的一些命令符;通過product id瀏覽某應用的隔離儲存區 (Isolated Storage)中的目錄,並把隔離儲存區 (Isolated Storage)總的檔案複製到pc檔案目錄;詳細
3>介紹了如何在新的應用中引用資料庫檔案並操作資料庫;包括怎麼將安裝目錄中的資料庫檔案複製到隔離儲存區 (Isolated Storage)中,如何直接連接安裝目錄中的資料庫檔案進行唯讀操作;通過一個通訊錄Test項目,讀取並添加新的分組來操作資料庫檔案;
Demo執行個體下載