程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 數據點: 從移動應用程序訪問數據

數據點: 從移動應用程序訪問數據

編輯:關於.NET

數據訪問是用 Microsoft® .NET Framework 精簡版為 Windows Mobile® 設備開發應用程序 的一個重要方面。通過使用現有體系結構在移動應用程序和應用程序服務器之間發送和接收數據,便可以 使用 DataSet、自定義對象或標量值傳遞數據。

在本期有關數據點這一部分中,我將討論開發 Smartphone 移動應用程序時數據訪問策略的最佳實踐 。我會演示如何設計可通過 Internet 顯示和保存數據的數據驅動 Smartphone 應用程序。還會介紹如何 與服務器應用程序進行通信,該應用程序提供了使用 DataSet、自定義對象和實體泛型 List<T> 獲取數據的方法。

移動開發

用於移動開發的基本工具

.NET Framework 精簡版 2.0 SP2

Windows Mobile 6 Professional 和 Standard SDK

Windows Mobile 5.0 SDK for Smartphone

Windows Mobile 5.0 SDK for Pocket PC

ActiveSync 4.5 (Windows XP)

Windows Mobile 設備中心 (Windows Vista)

Microsoft Device Emulator 2.0

Windows Mobile 6 仿真器

Windows Mobile 5.0 Smartphone 仿真器

具有橫向 屏幕的 Windows Mobile 5.0 Smartphone 仿真器

Windows Mobile 5.0 Pocket PC 仿真器

Motorola Q 仿真器

要開發移動應用程序,必須先安裝 .NET Framework 精簡版(及其最 新 Service Pack)。最新更新即帶有 SP2 的 .NET Framework 精簡版 2.0。在著手工作之前,您必須決 定要為應用程序選擇的目標平台(Windows Mobile 5.0 或 Windows Mobile 6)和設備。這些決定會影響 要安裝的 SDK 版本。

Windows Mobile 5.0 SDK 有多種不同版本可供使用,具體選擇取決於您的 目標是 Smartphone、Pocket PC 還是 Pocket PC Phone。Windows Mobile 6 SDK 也為不同的目標平台提 供了不同版本,但命名約定已更改,所以現在有一點不那麼直觀。圖 1 列出了各種 SDK 版本及其目標設 備。不用說,如果要面向每種設備,則需安裝每種 SDK。

Figure1Windows Mobile SDKs

目標設備 需要的 Windows Mobile 5.0 SDK 需要的 Windows Mobile 6 SDK Smartphone Windows Mobile 5.0 SDK for Smartphone Windows Mobile 6 Standard SDK Pocket PC Windows Mobile 5.0 SDK for Pocket PC Windows Mobile 6 Professional SDK Pocket PC Phone Windows Mobile 5.0 SDK for Pocket PC Windows Mobile 6 Professional SDK

本次討論中,我使用的是 Windows Mobile 5 for Smartphone。不過,版本不是最關鍵的,因為不論版本如何,存在的數據訪問概 念都是一樣的。

安裝了帶有 SP2 的 .NET Framework 精簡版 2.0 和適當的 Windows Mobile SDK 之後,還必須安裝 ActiveSync(用於 Windows® XP)或 Windows Mobile 設備中心(用於 Windows Vista®)。這些是移動設備仿真器與網絡或 Internet 通信所需的。

此外,還應下載和安裝 與目標設備最相似的仿真器。本專欄中,我選擇了橫向 320x240 屏幕。如果您的目標設備具有不同的屏 幕尺寸,則應使用所有相應的仿真器,針對每個尺寸測試您的應用程序。

如果您使用的是 Windows Vista 或 Windows Mobile 6 SDK,則需要安裝 Device Emulator 2.0。我知道這聽上去感覺要 安裝很多必備軟件,因此我在本專欄的下載部分上包含了一系列鏈接。

入門

我強烈建議對 仿真器和設備本身進行測試,從而避免發生應用程序在仿真器上能正常運行但在設備上無法正常運行這樣 的情形。我的方法是在開發移動程序的整個過程中都使用仿真器,然後在某個檢查點將應用程序部署到真 實移動設備。

調試之前,必須確保從 Visual Studio® 的“工具”菜單運行 “設備仿真器”。在選擇需要的仿真器後,右鍵單擊它並選擇“連接”。接著,仿 真器將開始引導 Smartphone。當 Smartphone 在仿真器中運行後,再次在“設備管理器”中 右鍵單擊該項,然後選擇“插入底座”。插入底座將允許仿真器與網絡進行通信。最後,在 Visual Studio 中,從“設備”工具欄的下拉列表中選擇仿真器(請參見圖 2)。

Figure 2 Selecting a Target Emulator

為獲取數據,我的示例應用程序會與某個 IIS Web 服務器上的 Web 服務進行通信。該 Web 服務對於 移動應用程序而言非常好用,因為它可以同時傳遞 ADO.NET 對象(如 DataSet)和自定義實體。首先, 我創建了一個 Web 服務項目並添加名為 CustomerWebService 的 WebService。將三個方法添加到 WebService 並使用 WebMethod 屬性分別進行修飾:

[WebMethod]
public Customer GetCustomer(string customerID) {
 ...
}
[WebMethod]
public DataSet GetCustomerDataSet(string customerID) {
 ...
}
[WebMethod]
public List<Customer> FindCustomerList() {
 ...
}

GetCustomer 方法會檢索自定義實體形式的單個客戶記錄。GetCustomerDataSet 方法也會獲 取單個客戶記錄,但此方法會以 DataSet 形式返回客戶。FindCustomerList 方法會獲取客戶列表,返回 List<Customer>,因此能夠利用客戶實體和泛型。此 Web 服務的完整代碼包含在可下載代碼中。

創建 Web 服務後,我將 Windows Mobile 5.0 Smartphone 應用程序添加到解決方案。如果您同 時安裝了 Windows Mobile 5.0 和 Windows Mobile 6 SDK,則可以在此對話框中選擇目標應用程序。此 項目中,我要創建的是 Windows Mobile 5.0 Smartphone 設備應用程序。

該 Smartphone 應用程 序將具備一個啟動窗體,可在下拉列表中顯示客戶列表。用戶可以選擇其中一個客戶,然後在其他頁面上 查看該客戶的詳細信息。客戶列表是從 Web 服務的 FindCustomerList Web 方法檢索的,後者將一個 List<Customer> 返回給窗體。之後,可以手動或自動將該列表綁定到下拉列表。(我將簡要說明 這兩種方法。)

自動綁定

CustomerPicker 窗體是用戶看見的第一個屏幕。我在此窗體中 添加了一個下拉列表,並命名為 ddlCustomer。我想要利用自動綁定,將下拉列表綁定到會從 FindCustomerList Web 方法返回的 List<Customer>。我將新的數據源添加到項目,選擇要綁定下 拉列表的實體類型。由於引用了 Web 服務,因此應用程序知道 WebMethods 會返回的實體類型。這讓我 能夠輕松地將強類型化實體綁定到下拉列表。

轉到“數據源”窗口,然後單擊“ 添加新數據源”,這樣會彈出向導。我選擇添加對象類型,單擊“下一步”,然後在提 供的列表中找到 Customer 實體(請參見圖 3)。如果添加新數據源時在列表中找不到實體,請確保先成 功編譯 Web 服務項目,然後返回並再次嘗試添加數據源。如果實體由 Web 服務提供,那麼,只有在編譯 DLL 之後才會在列表中顯示該實體。

Figure 3 Creating a Customer Data Source

添加數據源後,我將新的 Customer 數據源(請參見圖 4)從“數據源”窗口拖到下拉列 表。這會在名為 customerBindingSource 的窗體上自動創建 BindingSource 控件,並處理 Customer 實 體與控件之間的雙向綁定。

Figure 4 Using a Customer Data Source

在仿真器中測試應用程序之前設置自動綁定還有兩個步驟。下一步是設置下拉列表的 DisplayMember 和 ValueMember 屬性。我將 DisplayMember 屬性設為 CompanyName,ValueMember 屬性則設為 CustomerID。由於數據源是強類型化的,因此這些值位於下拉列表控件屬性窗口的下拉列表中。

最後一步是告知 BindingSource 控件去何處獲取數據。這就像創建 Web 服務代理類的實例一樣簡單,即 調用適當方法並將其返回的 List<Customer> 設置為 BindingSource 控件的 DataSource 屬性, 如下所示:

private void CustomerPicker_Load(object sender, EventArgs e)
{
  using (RemoteService.CustomerWebService svc =
            new RemoteService.CustomerWebService())
    customerBindingSource.DataSource = svc.FindCustomerList();
}

此時,便可以運行和測試應用程序,看它是否在下拉列表中顯示客戶列表。確保您已經在 Visual Studio 中設置目標設備、(根據需要)運行 ActiveSync® 或 Windows Mobile 設備中心, 並且正在模擬的設備已插入底座(使用設備仿真器管理器)。

綁定字段

創建和測試 CustomerPicker 窗體後,我創建了另一個名為 CustomerDetail 的窗體。這會顯示選中 的客戶。我更改了數據源設置,以便在將 Customer 數據源拖到窗體時創建詳細信息控件,然後自定義在 “數據源”窗口顯示的屬性。隨後我將控件拖到 CustomerDetail 窗體。圖 5 顯示了自定義之後的數據 源。

Figure 5 Customized Data Source

現在我必須從 Web 服務的 GetCustomer Web 方法獲取選中的 Customer 記錄。我使用在前一窗體選 中的 CustomerID,並調用 GetCustomer Web 方法。然後,返回的 Customer 實體會設為 CustomerDetail 窗體上 customerBindingSource 控件的數據源。現在我在仿真器中再次測試應用程序, 即可看到圖 6 所示的屏幕。

Figure 6 Application Running in the Emulator

移動綁定選項

通過在移動設備應用程序中使用 BindingSource 控件,實現自動綁定便輕而易舉。這與 BindingSource 控件在 Windows Forms 應用程序中的工作原理類似,最顯著的區別在於缺少 BindingNavigator 控件。由於移動應用程序沒有 BindingNavigator 控件,因此,如果您需要從一個記 錄導航到下一個記錄的功能,則必須編寫代碼。我傾向於避免此類功能,因為它通常是在檢索大型項目列 表時使用的。在移動應用程序中它會影響性能,因為移動設備通常具有有限的帶寬。因此,缺少 BindingNavigator 並非是件壞事,因為它可以提醒您節約帶寬。

BindingSource 解決了從實體手動獲取值並將其填入窗體控件的難題。保存記錄時,BindingSource 還消除了從窗體控件檢索值並將其導回實體的麻煩。BindingSource 的缺點在於,手動加載數據時加載過 程會有些慢。

如果測試中性能差異不是很大,我仍建議使用 BindingSource 控件。但是,我經常發現其性能已經足 夠。在需要將同一組數據綁定到多個控件時,您使用 BindingSource 控件所獲得的自動綁定也非常有幫 助。

更改為手動綁定十分簡單。只需刪除 BindingSource 控件,清除窗體上控件的數據源設置,並編寫一 些代碼將每個值從實體加載到相應控件即可,如下所示:

using (RemoteService.CustomerWebService svc =
new RemoteService.CustomerWebService()) {
RemoteService.Customer customer = svc.GetCustomer(_customerID);
companyNameTextBox.Text = customer.CompanyName;
customerIDLabel1.Text = customer.CustomerID;
...
}

請注意,使用手動方法時,還必須考慮用戶要保存數據時如何從控件提取數據。從控件 捕獲數據並將其導入實體的過程相當簡單,但是要讓用戶保存信息則還需要處理兩個額外的步驟。手動綁 定常見做法是將 Customer 實體存儲為 CustomerDetail 窗體的私有字段,這樣在需要提取控件數據或將 數據導回實體時可以輕松訪問該實體。

微調移動應用程序

由於帶寬可能有限,移動設備上的處理器比台式計算機慢,因此,只傳遞應用程序所需的最低數據量 是至關重要的。在示例應用程序中,我檢索了 Customer 實體列表,但只使用了每個實體中的兩個屬性。 這浪費了 CustomerPicker 屏幕的大量帶寬,因為它必須去獲取所有客戶的所有數據。

更有效的方法是創建僅檢索每個客戶 CustomerID 和 CompanyName 的方法。調整移動應用程序時必須 牢記此類注意事項,因為諸如此類的性能問題可能不會出現在桌面應用程序中。

結論

在著手移動開發之前,進行正確的設置非常重要。您必須確保具備正確的仿真器管理器版本、適當的 仿真器、正確的 SDK 以及所需的 ActiveSync 或 Windows Mobile 設備中心版本。當我在 Windows Vista 上運行應用程序時,只有安裝 Windows Mobile 設備中心 6.1 和設備仿真器管理器 2 之後,仿真 器才會與 Web 服務進行通信。這些是在 Windows Vista 中運行(甚至是面向 Windows Mobile 5.0)時 必須安裝的重要軟件更新。

如果嘗試使用 ActiveSync 查看仿真器時出錯,請確保 ActiveSync 已設置為通過 DMA 進行通信。如 果嘗試訪問 Web 服務時出錯,則請確保 Web 服務使用您的服務器名稱,而不是 localhost。Localhost 在您 PC 上會正常運行,但當仿真器嘗試解釋 localhost 時,它無法明白您指的是計算機的 Web 服務器 。另一個有用提示是,確保您連接仿真設備並插入底座,以便它能夠與本地 PC 進行通信。

如果需要有關將應用程序部署到真實移動設備的信息,請閱讀我在 2006 年 12 月期的數據點文章, “有關 Smartphone 的 RSS 源”(網址為 msdn.microsoft.com/msdnmag/issues/06/12/DataPoints)。

請將您想向 John 詢問的問題和提出的意見發送至 [email protected].

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved