Windows Phone 7開發前必懂的事-Isolated Storage
我相信有開發過Windows Mobile程式的人一定都會很熟悉,透過[檔案管理]去進入到所要的資料夾,
或是透過自行開發的程式去直接操作File System來讀取需要的檔案。但是到了Windwos Phone 7開始,
它採用Silverlight做為開發的元素,Silverlight它本身有一個先天設計,那就是獨立的記憶體處理區塊,
稱之為「Isolated Storage」。每一個Silverlight程式都只能控件自己的Isolated Storage,沒有辦法直接
透過檔案系統取得所需要檔案,像是我之前寫的DICT-SQLite字典的作法就沒有辦法正確的捉到SQLite,
那我該怎麼辦呢?修改程式之前,我們先重新來了解一下Isolated Storage到底是怎樣的一個東西。
過去我們在設計WinForm App時,要操作檔案系統來儲存用戶的設定、操作習慣或暫存資料是很容易的,
但在開發Web App時,要儲存這些資料可能就需要Postback去後端取得或是寫入Session或Cookie來取用,
這樣的做法,其實都有不少爭議,例如:Cookie或暫存資料被用戶不小心清掉了之類的問題。
Isolated Storage的設計就是讓每個App都可以處理自己獨立使用的區域,不會受其他App的影響,讓開發
的程式可以只關心自己內用的資料,雖然這樣也限制了一些開發的方便性,但我認為主體上是好的,
例如:瀏覽器某一個分頁掛掉了,不會影響其他分頁的運作,也許就是這樣的一個相似的用法。
Ioslate Storage主要提供的主要目的有二種:
‧Isolate File Storage:提供Ioslated Storage APIs去操作類似檔案管理系統的能力,但只限定在logical isolated
storage space。
‧Isolate Setting Storage:提供儲存Application Setting或是相關local setting的資訊。
透過上圖的說明,可以清楚的了解到,每一個運作在WP7中的Siverlight程式都被分派獨立的區域,
裡面可以處理或建立自己程式需要的檔案與設定,另外有一個值得的一提的是:
「Quota APIs will reflect that there is no quota.」在WP7裡System.IO.IsolatedStorage.IsolatedStorageFile取
消了原本Quota的數量限制,不過這樣的空間還是會受限於硬體的空間啦。
IsolatedStorage這個NameSpaces裡有幾個重要的類別是操作IsolatedStorage用到的,以下將做個簡單的
說明:
‧System.IO.IsolatedStorage. IsolatedStorageException (Mscorlib.dll)
專門處理當使用IsolatedStorage發生失敗時,所引發的Exception內容。它使用ISS_E_ISOSTORE,錯誤
代碼為:0x80131450。一般會發生的錯誤主要有二類:
a. 遺失證據(Miss evidence):evidence代表的是該App的assembly與origin資訊。IsolatedStorage需要透過
evidence來驗證code的識別、連結正確的Isolated Storage space。這個資訊不見,就沒辦法運作了。
b. 錯誤的運用(Invalid operations):有一些FileStream的功能,不支援於Isolated Storage。
‧System.IO.IsolatedStorage.IsolatedStorageFile (Mscorlib.dll)
提供取得隔離區中的檔案、目錄的方法與屬性,包括:CreateDirectory()、CreateFile()、Quota等。
透過該類別取得控制權後,配合IsolatedFileStream存取區域內的資料。
‧System.IO.IsolatedStorage.IsolatedStorageSettings (System.Windows.dll)
提供可以在隔離儲存區中儲存索引鍵值組的 Dictionary<TKey, TValue>。建立的程式專案裡,可以
自動建立一個Dictionary類型的設定值,透過key/value的方式來取得/設定值。通常用於程式的共用
變數、使用者操作的設定,例如:程式的設定(啟始目錄、初始值、顯示頁數等。)
‧System.IO.IsolatedStorage.IsolatedFileStream (Mscorlib.dll)
該類別主要提供操作隔離區中檔案與目錄。它與FileStream相似,擴充了FileStream的功能,通常會
配合StreamWriter與StreamReader操作隔離區的內容。
以上是基本的System.IO.IsolatedStorage的介紹,這樣的設計觀念,也影響我們的開發設計,
基於這樣的概念下,我原本還想說,我直接把我建立的好的SQLite.db直接放置於整個WP7開發專案中,
就可以像過去直接Build測試Emulator中,後來才發現新的概念是這樣的。因此,我覺得這個是對於像我
一樣剛進入Silverlight領域中的開發人員,需要先釐清的一個觀念。在此分享給大家做個記錄。
References:
‧Isolated Storage Overview for Windows Phone
‧System.IO.IsolatedStorage Namespace
‧[C#][VB.NET]Isolated Storage 隔離儲存區
‧http://msdn.microsoft.com/zh-tw/library/cc189021(VS.95).aspx
‧http://www.dotblogs.com.tw/johnny/archive/2010/01/19/13121.aspx
‧http://msdn.microsoft.com/zh-tw/library/kx3852wf(v=VS.80).aspx
‧http://wildermuth.com/2008/09/27/WebClient_vs_WebRequest_in_Silverlight_2
‧http://msdn.microsoft.com/zh-tw/library/ms144203(v=VS.95).aspx
‧http://msdn.microsoft.com/zh-tw/library/cc189021(VS.95).aspx
‧WP7 Boot Camp with Jeff Brand -操作WP7 Emulator有問題都可以參考此處。