【IT168技术文档】数据访问是用 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。
Figure 1 Windows Mobile SDKs
目标设备 需要的 Windows Mobile 5.0 SDK 需要的 Windows Mobile 6 SDK 目标设备 需要的 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。我知道这听上去感觉要安装很多必备软件,因此我在本专栏的下载部分以及《MSDN 杂志》网站 (msdn.microsoft.com/msdnmag/issues/08/01/datapoints) 上包含了一系列链接。
入门
我强烈建议对仿真器和设备本身进行测试,从而避免发生应用程序在仿真器上能正常运行但在设备上无法正常运行这样的情形。我的方法是在开发移动程序的整个过程中都使用仿真器,然后在某个检查点将应用程序部署到真实移动设备。
调试之前,必须确保从 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 进行通信。