本文章是由機器翻譯。

新型應用程式

Windows 應用商店應用中的資料訪問和存儲可選方案

Rachel Appel

 

Rachel Appel管理資料是應用程式開發中的關鍵組成部分。無論是遊戲、新聞、旅遊還是時尚應用程式,總是跟資料有關。新型應用程式通常需要對分散在多個離散位置且格式種類繁多的資料進行管理。我將討論可用來構建 Windows 應用商店應用的各種資料存儲可選方案和資料訪問 API(所有語言),以及內容和配置的資料管理原則。

資料管理和存儲注意事項

作為應用程式開發人員,您需要在專案啟動之前確定應用程式的資料需求,因為更改底層體系結構會導致很多工作都要返工。您可能已經有了資料來源,這種情況無需再做決定,但是對於初始專案,您必須考慮資料存儲在何處。您有兩個選擇,在設備上或遠端位置:

  • Local:通常這些資料在檔或本機資料庫中,但是在 Windows 8 中,您現在可以使用內置的檔選取器或合約,將其他應用程式作為資料來源。在 JavaScript 應用程式中,Web 存儲和索引型資料庫 (IndexedDB) API 也可用作本地資料來源。
  • 遠端:這些資料可以位於雲中(使用 Windows Azure SkyDrive),或者位於可提供 JSON 或 XML 資料的遠端 HTTP 端點(包括 Facebook 或 Flickr 之類的公共 API)。

資料的大小通常決定了資料在本地還是遠端;但是,對於大多數的新型應用程式,這兩種資料來源中的資料都可以使用。這是因為更小、移動性更強的設備(如平板電腦和手機)隨處可見,它們通常沒多少存儲空間。儘管如此,它們在離線時仍然需要資料才能正常工作。例如,Surface 與很多可擕式設備一樣,有 32GB 和 64GB 型號。簡單的基於文本的資料(如 JSON)通常不大,但是關係資料庫和媒體資料(如圖像、音訊和視頻)可以很快填滿設備。

讓我們看一下都有哪些本地和遠端可選方案可用於存儲應用程式的內容資料。

Web 存儲

從字面上來看,Web 存儲 (bit.ly/lml0Ul) 就是 Web 上的存儲,但事實並非如此。相反,作為 HTML5 標準,Web 存儲是將應用程式資料保存在用戶端本地的好辦法。Windows 應用商店應用和普通舊 HTML 頁面都支援 Web 存儲。由於 Web 存儲是一種記憶體中資料庫,因此不需要資料庫設置,也不需要複製檔。

借助下面的兩個視窗物件屬性之一可以通過 JavaScript 來訪問 Web 存儲:

  1. localStorage:本地資料在應用程式終止後持久存儲,可供將來的應用程式實例使用。
  2. sessionStorage:也是本地資料;但是,sessionStorage 在 Windows 應用商店應用終止執行時銷毀。

通過將動態屬性附加到 sessionStorage 或 localStorage 變數,可以將資料(從簡單類型到複雜物件)存儲到 Web 存儲中。動態屬性是鍵/值對,語法如下:

sessionStorage.lastPage = 5;
WinJS.xhr({ url: "data/data.json" }).then(function (xhr) {
  localStorage.data = xhr.responseText;
};

lastPage 屬性是 sessionStorage 的組成部分,延續到應用程式終止;而 localStorage 的 data 屬性則在應用程式的生命週期完結之後仍會持久保存。

Web 存儲可在應用程式會話之間將資料持久保存在本地,從而使其成為支援離線應用方案的極佳選擇。 小型資料也更適合離線支援。 由於 JSON 資料很緊湊,因此很容易將整個 JSON 資料集都存入 Web 存儲提供的 5MB 空間中,還能有足夠的空間留給某些媒體資料。

因為 Web 存儲是 HTML5 標準,因此只能用於使用 JavaScript 構建的 Windows 應用商店專案中。

IndexedDB

HTML5 系列中的另一個標準是 IndexedDB (bit.ly/TT3btM),針對大型可搜索持久資料集的本地資料存儲。 作為 HTML5 的元件,可以將 IndexedDB 用於瀏覽器用戶端 Web 應用程式和 Windows 應用商店應用。 IndexedDB 在物件資料庫中存儲項,並且極為靈活,可以存儲從文本到二進位大物件 (BLOB) 的任何類型的資料。 例如,多媒體檔案往往很大,因此在 IndexedDB 中存儲音訊和視頻是很好的選擇。

因為 IndexedDB 是物件資料庫,因此它不使用 SQL 語句,必須通過物件導向的樣式語法來訪問資料。 與 IndexedDB 資料存儲交互需通過事務和游標,如下面所示:

var dataStore = "Datastore";
var trn = db.transaction(dataStore, IDBTransaction.READ_ONLY);
var store = trn.objectStore(dataStore);
trans.oncomplete = function(evt) { // transaction complete };
var request = store.openCursor();
request.onsuccess = function(evt) {
  var cursor = evt.openCursor();
};
request.onerror = function(error) { // error handling };

由於 IndexedDB 專門針對的是大型資料,用它來存儲小型項會導致運行效率低下,因此位(或位元組)級別的本地資料更適合採用 Web 存儲。 IndexedDB 還非常適合存儲內容資料,但是不適合存儲應用程式佈建資料。

SQLite

SQLite (bit.ly/65FUBZ) 是一種基於檔的自包含事務性關係資料庫,它不需要配置,且不需要資料庫管理員來維護。 可以將 SQLite 與任何 Windows 運行時 (WinRT) 語言一起使用,並且可用作 Visual Studio 擴展。 儘管 SQLite 在 JavaScript 應用程式中工作良好,但是您在使用之前仍需要從 GitHub 獲得 SQLite3 的 WinRT 包裝 (bit.ly/J4zzPN)。

具有 ASP.NET 或 Windows Forms 背景的開發人員更傾向于使用關係資料庫。但是,鑒於行動裝置的空間問題,以及資料的各種類型和格式(尤其是多媒體),對於開發新型應用程式而言,關係資料庫管理系統 (RDBMS) 並非總是最佳選擇。 由於 SQLite 是關係資料庫,對於需要關係和事務性行為的應用程式,它才有用武之地。 這意味著 SQLite 是業務線 (LOB) 應用程式或資料輸入應用程式的很好選擇,也可以作為一個存儲庫,最初從連線源獲得資料,然後存儲在本地供離線使用。

如果 SQLite 資料庫對於便攜行動裝置過大,可以將其移動到伺服器或雲位置。 需要更改的代碼並不多,因為 SQLite3 庫使用傳統連接,創建/讀取/更新/刪除 (CRUD) 物件類似于下面的代碼:

// C# code that opens an async connection.
var path =
  Windows.Storage.ApplicationData.Current.LocalFolder.Path + @"\data.db";
var db = new SQLiteAsyncConnection(path);
// JavaScript code that opens an async connection.
var dbPath =
  Windows.Storage.ApplicationData.current.localFolder.path + '\\data.db;
SQLite3JS.openAsync(dbPath).then(function (db) {
  // Code to process data.
});

可見,SQLite 的使用和其他 SQL 資料庫一樣。 SQLite 資料庫的上限可高達 140TB。 請注意,非常大的資料通常需要專業的資料庫管理,以獲得可能最佳的資料完整性、性能和安全性。 大多數使用關係資料庫的 DBA 和開發人員,首選 GUI 工具來創建和管理資料庫物件或對資料運行即席查詢,對於所有基本 SQLite 操作而言,Sqliteman (bit.ly/9LrB1o) 管理公用程式是理想的選擇。

如果您要移植用 Windows Forms、Windows Presentation Foundation (WPF) 或 Silverlight 編寫的現有 Windows 桌面應用程式,您可能已經在使用 SQL Server Compact (SQL CE)。 如果確實如此,可以使用 ExportSqlCE (bit.ly/dwVaR3) 公用程式將 SQL CE 資料庫移轉到 SQLite,然後使用 Sqliteman 來管理資料庫。

檔即資料和檔 API

何必糾結于資料庫,尤其是應用程式的使用者希望堅持使用他們已有的檔? 對於照片和文檔尤其如此。 檔 API 遠不止是目錄和檔的導航器;它給予使用者選擇應用程式作為檔位置的能力。 這意味著應用程式可相互對話和交換資料。 檔打開選取器可與 Bing、相機或照片應用程式,以及常規目錄和命名位置(如「我的文件」、「視頻」或「音樂」)交互。 在應用程式、服務和個人檔之間如此輕鬆共用資料是 Windows 最炫的功能。

很多作業系統提供了一種機制,用於註冊應用程式要使用的檔案類型,當使用者對作業系統中的檔圖示進行操作時,系統將啟動相應的應用程式。 在 Windows 中,這稱為檔關聯。 Windows 8 延伸了這一概念,通過名為「合約」的系統級功能,應用程式可以相互對話。 實現合約的一種方法是通過檔選取器。 Notice that the following code is similar to the File Dialog APIs from desktop apps or earlier Windows versions (note: some code has been left out of this example for brevity; for a more thorough examination of the FileOpenPicker class, see bit.ly/UztmDv):

fileOpen: function () {
  var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
  openPicker.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail;
  openPicker.suggestedStartLocation =
    Windows.Storage.Pickers.PickerLocationId.picturesLibrary;
  openPicker.fileTypeFilter.replaceAll([".png", ".jpg", ".jpeg"]);
  openPicker.pickSingleFileAsync().done(function (file) {
  // ...
});
}

從 Windows 8 選取器中選擇一個應用程式將會啟動該應用程式。 例如,如果使用者選擇 Bing,選取器將啟動 Bing 應用程式,然後將使用者的圖像選擇返回給您的應用程式。

現在,我們瞭解了本地可選方案,接下來看看遠端資料的可選方案。

Web 服務和 ASP.NET Web API

大多數開發人員都熟悉利用 XML Web 服務來使用和修改資料,因為他們經歷了 Microsoft .NET Framework 1.x 的那個時代。 使用 Web 服務的主要優點是,資料存儲在一個遠端的中心位置中,多個設備的應用程式可在連接的任何時刻訪問資料。 對底層資料庫的訪問則通過一組 HTTP 端點間的管道來交換 JSON 或 XML 資料。 很多公共 API,如 Twitter 或 Flickr,公開可在 Windows 應用商店應用中使用的 JSON 或 XML 資料。

Web 服務有各種類型:

  • ASMX 服務:使用傳統 ASP.NET 通過 HTTP 發送資料。
  • Windows Communication Foundation (WCF) 和豐富 Internet 應用程式 (RIA) 服務:一種基於消息、在 HTTP 端點間發送資料的方法。
  • OData:開放資料協定,另一種通過 HTTP 傳輸資料的 API。
  • ASP.NET Web API:一個新的 ASP.NET MVC 4 框架,可以輕鬆構建支援 REST 的 HTTP 服務,向應用程式或網站發送 JSON 或 XML 資料。

如果您從頭開始構建後端服務,ASP.NET Web API 可簡化開發過程,因為它能夠以一致的方式輕鬆構建支援 REST 的服務並可供應用程式使用。

無論什麼後端服務,只要是通過 HTTP,就可以使用 HttpWebRequest 和 HttpWebResponse 物件通過 C# 與 Web 服務通信。 在 JavaScript 應用程式中,WinJS XMLHttpRequest 包裝適合非同步作業,類似下面的代碼:

WinJS.xhr({ url: "data.json" }).then(function (xhr) {
  var items = JSON.parse(xhr.responseText);
  items.forEach(function (item) {
    list.push(item);
  })
});

存儲空間對於 Web 服務來說通常不是問題,因為 Web 服務只是在端點之間傳輸資料的軟體。 這意味著其底層資料庫可位於任何位置,如遠端伺服器、Web 主機或 Windows Azure 實例。

您可以在 Windows Azure 上託管前面提到的任何 Web 服務,如 ASP.NET Web API 實例或 WCF 服務,以及資料本身。

SkyDrive

不要忘記 SkyDrive (bit.ly/HYB7iw) 不僅是資料存儲的可選方案,而且是一個絕佳的方案。 將 SkyDrive 想像成非存儲的存儲可選方案。 使用者可以選擇 SkyDrive 作為雲中的位置,並通過「檔打開」或「保存」選取器訪問文檔。 允許使用者將檔保存到 SkyDrive 意味著無需操心資料庫管理,而且每使用者 7 GB 的空間綽綽有餘。 SkyDrive 使用者還可購買更多存儲空間。

Live API (bit.ly/mPNb03) 包含有一整套支援 REST 的 SkyDrive API,可用於讀取和寫入 SkyDrive。 下面顯示了一個用於檢索共用項清單的 SkyDrive 調用:

GET https://apis.live.
netv5.0/me/skydrive/shared?access_token=ACCESS_TOKEN

Microsoft.Live 命名空間允許 C# 開發人員訪問 Live 和 SkyDrive API,而 JavaScript 開發人員可以用 HTTP 謂詞 POST 或 PUT 發出支援 REST 的調用。 應用程式佈建資料不推薦使用 SkyDrive。

Windows Azure 移動服務

Windows Azure 移動服務是構建跨平臺和多平臺應用程式的極佳可選方案。 依託于 Windows Azure 的支援,此可選方案提供的不僅僅是可擴展的存儲;它還提供推送通知、業務邏輯管理、身份驗證 API 和一套完整的 SDK。 除了這些功能外,它還提供了一個便於使用的基於 Web 的管理工具。

移動服務 SDK 集成了對 Windows 應用商店、Windows Phone 8、iOS 和 Android 應用程式的支援。 支援所有主流平臺;通過移動服務 SDK,您只需幾分鐘便可構建出一個工作原型,隨即便可直接將資料交付到多平臺應用程式。

SDK 提供了諸多功能。例如,您可以使用查詢物件來查詢表中的資料,如下所示:

var query = table.orderBy('column').read({ success: function(results) { ...
}});

如您所見,代碼與任何其他 API 非常相似,因此學習曲線與此處討論的其他可選方案一樣。 可以使用任何 Windows 應用商店應用的開發語言訪問 SDK 和媒體服務。

應用程式資料管理和存儲可選方案

前面說到的所有資料存儲和訪問可選方案都可以用來存儲內容,但是作為開發人員,您還需要處理應用程式的配置資料。 這指的是描述應用程式或其設備能力的中繼資料,而不是使用者的資料。 新型應用程式會使用持久應用程式資料(如使用者首選項)和臨時中繼資料(如使用者上次滾動位置或趨勢搜索項)。 這些小但有效的便利措施確保使用者獲得盡可能好的體驗,因此將它們構建到應用程式中非常重要。

雖然其中的某些資料屬於設備,但考慮到很多應用程式跨多個平臺和設備工作這一實際情況,將應用程式資料集中于 Windows Azure 並與內容資料同步通常會帶來益處。

Windows.Storage 命名空間中的 ApplicationData 類(恰如其名)提供了一組專用於管理應用程式資料的 API,代碼如下:

var localSettings = Windows.Storage.ApplicationData.current.localSettings;
var roamingSettings = Windows.Storage.ApplicationData.current.roamingSettings;

您可以在 localSetting 或 roamingSetting 屬性中存儲簡單或複雜物件。

使用本地或漫遊設置是處理配置資料的首選方式。 IndexedDB、檔或 SkyDrive 之類的技術通常不是應用程式佈建資料的好選擇,而 SQLite 只有在應用程式已經使用它來存儲內容的情況下才會有意義。 您還必須考慮,應用程式在離線或與 Internet 斷開連接時應該如何使用資料。 換言之,您的某些資料需要緩存,但是不應消耗過多磁碟空間。

內容和配置

總之,為了實現正確的資料體系結構,您不應依賴于可攜式裝置上的有限空間,因此在雲中託管資料通常是個好辦法。 但是,如果有舊式資料庫,則重用該資料庫或許不可避免。 針對內容和配置,Windows 應用商店應用支援各種結構化和 BLOB 存儲需求。

如果您要構建 Windows 應用商店應用,並希望獲得有關如何選擇資料訪問策略的説明,強烈建議您瞭解「新一代應用」(bit.ly/W8GenAppDev) 計畫。 「新一代應用」通過提供免費的技術和設計諮詢及説明,以及專門的提示與資源,指導您完成在 30 天內構建 Windows 應用商店(或 Windows Phone)應用的過程。

Rachel Appel 是 Microsoft 在紐約市的開發推廣人員。您可以通過 rachelappel.com 網站與她聯繫,或者通過電子郵件 (rachel.appel@microsoft.com) 與她聯繫。您還可以在 Twitter 上(網址為 twitter.com/rachelappel)留意她的最新更新。

衷心感謝以下技術專家對本文的審閱:Scott KleinMiriam Wallace