移动数据库开发教程


移动数据库开发教程(图一) 前言

在本文中我选用了Sybase SQL Anywhere Studio作为教程的基础,因为它是领导市场的移动数据库产品。它支持多种平台(包括Linux、Win32、WinCE、Palm OS和Symbian)、强大的多RDBMS(关系型数据库管理系统)同步解决方案、JDBC和ODBC连接、灵活的配置选项--它占有68%移动数据库市场--这使它成为开发移动项目的极好的候选产品。你必须首先安装SQL Anywhere Studio 8.0(可以从Sybase网站http://www.sybase.com上下载60天试用版)。安装的时候,在不能确定需要什么、不需要什么之前,你要确保选择最多的选项。你至少要安装ASA和Ultralite数据库选项、所有的MobiLink同步选项、Sybase Central和jConnect。

建立数据库

安装完成后,Sybase Central工具将成为你想执行的几乎所有事务的管理员控制台。SQL Anywhere Studio工具集的优点之一是能够使用工具(例如Ant)通过命令行访问几乎所有的功能,这也是运行自动化过程的一个重要的需求。图1显示了Sybase Central中提供的多种工具,包括建立和维护Adaptive Server Anywhere(ASA)数据库必要的工具。

移动数据库开发教程(图二)
图1:Sybase Central工具

图2到图7演示了使用Sybase Central建立一个新的ASA数据库的过程。我使用这些过程建立了一个新的mobile_sales.db数据库文件(对应的日志文件是mobile_sales.log)。

移动数据库开发教程(图三)
图2:建立数据库向导

移动数据库开发教程(图四)
图3:在"建立数据库向导"中指定日志文件

移动数据库开发教程(图五)
图4:在"建立数据库向导"中指定Java支持

移动数据库开发教程(图六)
图5:在"建立数据库向导"中配置数据库选项

移动数据库开发教程(图七)
图6:在"建立数据库向导"中指定页面大小

移动数据库开发教程(图八)
图7:在"建立数据库向导"中指定整理顺序

这个向导将为你建立和运行数据库--注意当完成上面的事务后,在Windows工具条上有一个小的SQL图标。注意ASA数据库是"微型服务器"数据库,它在自己的进程中运行并监视输入请求的端口,这与基于文件的"Ultralite"配置选项(文章的后面会讲到)形成了鲜明的对比。建立产品性质的应用程序的开发人员必须处理所有ASA运行时文件的配置(在产品文档中有详细的说明)和系统或应用程序每次启动时需要启动的ASA数据库进程。实现这种功能的最容易的方法(对于Windows 2000/XP用户)是建立当操作系统启动时自动启动数据库的一个Windows服务。Sybase有一个实现这种功能的命令行工具(dbsvc)。如果你对把数据库作为服务运行不感兴趣,你可以使用dbeng8命令手工启动数据库。

建立表

我们建立的简单销售应用程序允许用户访问我们公司销售的所有产品和公司的客户的信息。用户可以建立/修改新的销售订单,完成后,可以把修改过的数据同步到组织的中心服务器RDBMS。我们的数据库大纲非常简单(四个表),它的目的是突出SQL Anywhere Studio的能力和移动开发技术。为了达到应用程序的目标,我们需要四个表来存储销售和产品信息:CUSTOMER、PRODUCTS、OPPORTUNITIES和SALES。图8至图11显示了这些表中的格式。

移动数据库开发教程(图九)
图8:建立CUSTOMER表

移动数据库开发教程(图十)
图9:建立PRODUCTS表

移动数据库开发教程(图十)
图10:建立OPPORTUNITIES表

移动数据库开发教程(图十二)
图11:建立SALES表

用于建立这些表的ASA SQL语句如下:

CREATE TABLE "DBA"."CUSTOMER"
(
"ID" integer NOT NULL,
"FIRST_NAME" varchar(50) NULL,
"LAST_NAME" varchar(50) NOT NULL,
"STREET_ADDRESS_NUMBER" integer NULL,
"STREET_NAME" varchar(50) NULL,
"CITY" varchar(50) NULL,
"STATE" varchar(2) NULL,
"ZIP" integer NULL,
"REMARKS" text NULL,
PRIMARY KEY ("ID")
)

CREATE TABLE "DBA"."PRODUCTS"
(
"ID" integer NOT NULL,
"NAME" varchar(200) NOT NULL,
"PRICE" money NOT NULL,
"PRODUCT_NUMBER" varchar(50) NOT NULL,
"QUANTITY_IN_STOCK" integer NOT NULL,
"REMARKS" text NULL,
PRIMARY KEY ("ID")
)

CREATE TABLE "DBA"."OPPORTUNITIES"
(
"ID" integer NOT NULL,
"CUSTOMER_ID" integer NOT NULL,
"PRODUCT_ID" integer NOT NULL,
"CONTACT_DATE" datetime NOT NULL,
"REMARKS" text NULL,
PRIMARY KEY ("ID")
)

CREATE TABLE "DBA"."SALES"
(
"ID" integer NOT NULL,
"CUSTOMER_ID" integer NOT NULL,
"PRODUCT_ID" integer NOT NULL,
"QUANTITY" integer NOT NULL,
"TOTAL_PRICE" money NULL,
"REMARKS" text NULL,
PRIMARY KEY ("ID")
)

最后一步,我们要通过建立数据库中的用户帐号使应用程序能在现实世界(或与现实世界相近的地方)中使用。这也可以通过Sybase Central界面完成。我在starter数据库中建立了叫做"salesperson"的用户,密码是"sales"。该用户可以使用这个用户名/密码组登陆到数据库(通过Sybase的dbisql查询工具或自己的应用程序)。 使用Ultralite配置

文章的前面我简短地提到了SQL Anywhere的Ultralite配置选项。对于不需要完整的SQL数据库服务器(也就是集成安全性、存储过程、触发器、视图等等)服务的应用程序,Ultralite选项提供了可以使用C或Java API访问的基于文件的配置方法。 这种方法提供了更大的简单性,包括不需要安装高级能力的费用和应用程序的灵活性。Ultralite应用程序要求在设计时定义一个Ultralite项目并预定义将使用的所有SQL语句。接着这些SQL语句在"预处理"进程(ulgen)中被集中生成必要地Java、C或C++源代码,接着这些代码被编译成父应用程序;当结果应用程序首次运行时,嵌入式的运行时将建立一个新的Ultralite数据库文件。Ultralite应用程序能通过MobiLink同步程序同步,与ASA数据库类似。前面我们提到,他们在数据库中没有提供任何数据处理逻辑或安全性,这个重担就交给应用程序开发者了。

连接到ASA

向ASA数据库的连接通过jConnect JDBC驱动程序实现,它包含在安装后的Sybase\Shared\jConnect-5_5目录的jconn2.jar文件中。为了从应用程序中访问这个JAR文件,只需要在类路径中简单地包含jconn2.jar ,与使用其它的Java文档一样。这个档案包含了Sybase地100%的JDBC驱动程序。它也替应用程序包含了希望使用JDBC-ODBC桥连接到RDBMS的独立的驱动程序。在任何JDBC应用程序中,第一步是建立一个可用于查询数据库的java.sql.Connection对象。下面的代码片断演示了如何实现它:

Properties props = new Properties();
props.put( "user", "admin" );
props.put( "password", "123456" );
Class.forName( "com.sybase.jdbc.SybDriver" ).newInstance();
String URL = "jdbc:sybase:Tds:localhost";
Connection conn = DriverManager.getConnection( URL , props );
上面代码建立的连接使用了"ServiceName"参数,它必须遵循下面的语法:
jdbc:sybase:Tds:machine-name:port-number?ServiceName=DBN
com.sybase.jdbc.SybDriver类允许我们使用SybDriver类的setRemotePassword()方法传递附加的参数。

查询数据库

在建立连接后,可以使用标准的java.sql类(例如PreparedStatement、Statement和RowSet)查询数据库并检索数据。因为这个概念对于Java开发者来说比较熟悉,我简单地给出了一个例子:

PreparedStatement tempStmt = conn.prepareStatement("select ID from CUSTOMER");
ResultSet result = tempStmt.executeQuery();

while (result.next()) {
ID = result.getInt(1);
}

result.close();
tempStmt.close();

Adaptive Server Anywhere数据库也支持在数据库自身内执行Java类。ASA运行时包含一个内部的Java VM(Java虚拟机),它允许Java类在数据库中配置和安装,接着就可以被SQL语句作为函数访问。你也可以把安装在数据库中的Java类作为表的列的数据类型。这种讨论的关键点是Java开发者是ASA世界中的一流的"市民",你可以使用的的强大的JDBC也可以在移动设备上使用。

Java UltraLite配置

前面我们讲到,UltraLite是SQL Anywhere Studio 8.0应用程序的"微型"配置选项。UltraLite数据库都是单独的文件,并且UltraLite运行时数据库引擎实际上被编译进应用程序中(与ASA不同,ASA作为独立的应用程序存在并且使用TCP/IP套接字与你的Java应用程序通讯)。与ASA不同,UltraLite不支持高级的概念,例如数据库中的存储过程、触发器、内部安全性和Java。UltraLite数据库文件可以使用下述的方法之一建立:

使用ulinit基于已有的ASA数据库大纲生成UltraLite大纲。

使用UltraLite大纲画板(图12所示)建立新大纲。

移动数据库开发教程(图十三)
图12:UltraLite大纲画板工具

进入UltraLite大纲画板工具,你可以发现在UltraLite中不支持几种ASA数据类型--包括VARCHAR和TEXT(我们用于建立mobile_sales.db数据库的两种数据类型)。当你建立了希望得到的mobile_sales(为了一致性)大纲后,可以发现画板工具为你建立了一个mobile_sales.usm文件。这个文件必须与应用程序一起配置。你的应用程序首次运行时,UltraLite Java运行时将读取.usm文件并建立应用程序要使用的mobile_sales.udb数据库。UltraLite Java代码看起来与ASA的不同,特别是在建立到数据库的初始连接的时候。为了检索数据库连接,UltraLite应用程序使用了ianywhere.native_ultralite.DatabaseManager类。在数据库连接被检索到后,UltraLite支持了一个更加简单的数据库操作的子集。你可以使用"find"(即findFirst()、 findNext()、 findBegin()等等)或"lookup"(即lookupBegin()、 lookupForward()、 lookupBackward()等等)方法检索单独表的内容。为了提供简化的用户认证,需要在大纲中存储四个用户名/密码组合。你可以发现,典型情况下UltraLite应用程序是非常简单和直接的数据库应用程序,只有少量的表,没有复杂的查询或数据处理逻辑。

在ASA的jConnect库和本地的Java库的UltraLite之间还有一个重要的差别。UltraLite的Java类使用JNI本地方法"在保护之下"执行数据库访问。这意味着jul8.jar文件必须位于类路径之中,并且包含在安装的ultralite\NativeUltraLiteForJava\win32目录中,uil8.dll文件必须包含在系统的路径中。 ADO

对于微软技术开发者来说发现Sybase为Adaptive Server Anywhere提供了ADO接口并不惊奇,它与ASAProv OLE DB提供程序和Adaptive Server Anywhere、Sybase Adaptive Server Enterprise (ASE)、 Oracle和DB2的iAnywhere ODBC驱动程序协同工作。ODBC驱动程序可以使用安装在你的系统中的标准的ODBC数据源管理器配置。在该管理工具中,点击"添加"建立移动销售数据库的新的数据源。选择Adaptive Server Anywhere 8.0驱动程序将出现"ASA ODBC配置"对话框(图13所示)。

移动数据库开发教程(图十四)
图13:配置ASA ODBC连接

你会发现,我把本地数据源命名为MOBILE_SALES,当建立到mobile_sales.db数据库的ADO连接时我将使用这个DSN。一旦DSN配置好了,你就能够开始开发了。在微软Visual Basic 6.0中, 必须添加到ADO 2.5和ADO Recordset 2.5库的引用。实现方法是:从Visual Basic集成开发环境的"项目"菜单中选择"引用"。接着Visual Basic开发者(假定为移动Windows 2000/XP膝上型或平板电脑开发)就可以使用ADO对象了,包括Connection、 Recordset、Record和Field。为了建立到运行的ASA数据库的连接,标准的ADO语法如下:

Dim rs As ADODB.Recordset

conn.Open "Provider=ASAProv;Data Source=MOBILE_SALES;User Id=dba;Password=sql;"

Set rs = conn.Execute("select * from CUSTOMER")

Do While Not rs.EOF
'执行一些操作
Loop

conn.Close
Set conn = Nothing

Windows CE开发

如果Windows CE/Pocket PC应用程序开发对于你来说是个新事物,你会发现微软提供的移动平台的ADO API子集很有趣。Pocket PC 2002包括了ADOCE 3.0,它包含了"主要的"ADO对象,例如Connection、Recordset和 Field。HPC(手持式PC)专业版3.0设备、Palm PC 1.2和Pocket PC 3.0设备都支持ADOCE。SQL Anywhere Studio 8包含了Windows CE的Adaptive Server Anywhere OLEDB提供程序(在下面的文件中包含:dboledb8.dll、dboledba8.dll和dblgen8.dll)。ASA支持ODBC、OLE DB和Windows CE上的嵌入式SQL客户端,但是不支持大多数附加的ASA功能(例如交互式SQL、外部存储过程、数据库中的Java)。

对于Visual Basic编程语言熟悉的开发者在使用VB开发手持式设备时有两种选择。第一种是使用嵌入式Visual Basic 3.0开发工具包,它可以从微软网站上免费下载。该嵌入式Visual Tools 3.0安装文件也包含嵌入式Visual C++、SDKs和所有微软移动平台的模拟器。

MobileVB和UltraLite

第二种选择是AppForge Mobile VB,它允许在Visual Basic中建立单个应用程序,但是该应用程序可以被编译并配置到Palm OS设备上。本文中我将讨论如何使用Mobile VB访问某个UltraLite数据库。SQL Anywhere Studio 8包含了一个MobileVB UltraLite"结晶块"(AppForge的术语,指能够从Visual Basic代码中访问的组件)。这个"结晶块"是提供给Windows CE 设备的ulingot8.dll和提供给Palm OS设备的ulingot8.prc。这些文件都包含在\Program Files\Sybase\SQL Anywhere 8\ultralite\UltraLiteForMobileVB目录中(如果你选择了默认的安装路径是Program Files目录的情况)。
MobileVB UltraLite API与我们前面讨论的Java API类似。Java API使用的所有相同的对象现在都可以使用Visual Basic语法,包括ULDatabaseManager、ULConnection和ULTable。因为MobileVB UltraLite可以被配置到三种独立的平台(Win32、Palm和WinCE),在每个平台上指定数据库的位置是必要的,因为这三种操作系统的文件系统不同。可以在这三种操作系统上使用的连接字符串可能如下所示:

Dim dbLocation As String
dbLocation = "dbf=c:\mobile_sales
mobile_sales.udb;palm_db=mobsales;ce_file=
Program Files\Mobile Sales\mobile_sales.udb;"

为了建立大纲文件的位置也需要执行相似的操作,这样应用程序第一次运行的时候,UltraLite数据库才能被正确地建立。

Dim schemaLocation As String
schemaLocation = "schema_file=c:\mobile_sales
mobile_sales.usm;palm_schema=mobile_sales.usm;ce_schema=
Program Files\Mobile Sales\mobile_sales.usm"

当应用程序启动时,属性列表被组合并传递到ULDatabaseManager.CreateDatabase()方法中。如果这个方法成功的话,它会返回一个ULConnection对象,该对象可以用于检索表的内容。在Java UltraLite API中我们谈到,UltraLite 的MobileVB结晶块只包含非常基础的数据访问功能。如果你对在移动数据库上执行更多的操作有兴趣,你要么选择使用微软嵌入式Visual Tools或Java,从而对平台的支持有一定的限制,或者通过MobileVB访问提供给ASA的C语言的OLE DB接口。

业务示例

大约十年间,关系型数据库用于存储大块的企业业务数据,并且几乎所有封装的企业应用程序(CRM、ERP等等)都需要它们。但是历史上移动工作者被从活动数据更新(例如改正的投递位置、被更新的客户需求和销售产品的最新清单和价格)中隔离开来了。 尽管协同内联网可以传递很多这类信息,但是标准的Web应用程序需要健全的连接到内部网Web服务器的连接(最小14.4Kbps)。

WAP(无线应用程序协议)可以在无线网络上传递少量的只读信息,但是它自己也引起了一些问题。移动设备上的WAP浏览器的问题、电话上数据输入的问题、当前无线网络上的低通讯带宽的问题使WAP并不能被所有人使用。同时,我承认WAP是大量全球的劳动者使用的一个很好的解决方案,因为它可以跨越网络、设备和地域使用。

尽管"无线Web"解决方案可能适合多数情况下的需求,但是如果有下面的需求怎么办呢?

· 移动用户在没有无线连接的时候(可能连接很差或不存在连接)必须能够工作。

· 应用程序必须提供重要的交互性。

· 应用程序必须能够访问本地设备/载体硬件(例如打印机、条形码扫描器或GPS单元)。

· 必须保存带宽(按传递字节或数据收费的无线网络的一种普通的需求)。

· 用户不必访问真实的活动数据,只用访问最近修改过的数据。

如果你的应用程序符合所有的这些需求,有机会建立带有同步操作的移动数据库应用程序是很好的。如果实际上用户能够更新数据并把这些更新"复制到"中心RDBMS,就需要双向的数据同步。假定你正在读数据,我将解释解释同步为什么实际上是十分困难的问题--它是移动数据同步产品处理得最好的问题。

同步问题

原先看起来简单的问题实际上很复杂,这是大多数软件项目中的典型情况。如果你的应用程序太复杂,以至于在客户端上必须有一个关系型数据库,这可能意味着你的企业数据库正在处理相当多的数据。在美国移动工作者通过CDPD或GRPS连接的概率较大。它们都是报文分组网络,提供了良好的全国性的连通性;但是典型情况下两种技术的费用都是基于传递的数据量的,由于这个原因,在这些网络上传递的数据量被最小化了。这意味着需要给同步进程添加附加的代码逻辑,只有这样才能使用户最后同步之后的被修改过的记录通过网络传递。在大多数应用程序中,即使数据发生了改变,大量查找数据也很罕见。你的设计过程必须识别这些元素,并建立计划在有线网络(或WiFi)上建立这种查找数据,以防止过长的下载和高额的访问费用。

当数据被同步到客户端时,一般都需要建立某种"清除"这些移动客户端的无效数据的策略。例如,对于典型的Pocket PC设备,总共可能有32MB内存。没有必要保存一个月前指定的投递地址和维修信息!还有应用程序层安全性的问题。如果你的应用程序与另一个企业应用程序同步,如果某个用户被排除在该企业应用程序之外(密码超期、用户离开了公司等等),这些改变也应该被同步到移动应用程序中。因为大多数数据库应用程序严重依赖于主键的原理为数据生成唯一的ID,因此需要设置某种策略,当设备A上的用户A建立一个新记录的时候(主键为123456),设备B上的用户B不能建立有相同主键的新记录。如果发生这种情况,当这条记录同步的时候,试图把它插入到企业数据库的时候会收到一个主键违规错误。

作为这些问题的补充,目前还有数据冲突的问题。假设移动用户A根据发送过程中收集的信息更新某个客户的家庭地址。在它同步前,返回办公室的某个人也修改了该客户的地址。当用户同步的时候,谁的更新会"胜利"?用户A是否能覆盖那个办公室用户的更新?希望不是这样。我们所需要的是某种识别并适当处理这些冲突的机制--通常通过更新一个或多个中间表实现,接着LAN用户可以手动查看这些冲突并决定哪种更新是有效的(由于用户更新了相同记录的不同字段,因此它们通常都有效)。

MobiLink同步

实际上当数据离开集中式RDBMS,被分割并通过电波发送到各处时还会出现其它一些问题。但是,为了避免你完全被移动数据库开发吓跑了,我只提供了一个通用的解决方案。在Sybase SQL Anywhere Studio 8开发工具包中包含了一种数据同步技术,即我们所知道的MobiLink,它包含了一个用于处理正在同步的用户的输入请求的多线程服务器应用程序(多种UNIX、Linux和Windows 2000/XP都支持)。MobiLink开发过程的一部分包括开发大量的将安装到目标服务器RDBMS的同步SQL脚本。典型情况下,数据库中的每个表有一个或多个同步脚本(处理上载和下载数据的多个脚本),以及允许同步安装和卸载的几个安装事件脚本(begin_synchronization、 begin_upload、end_download等等)。数据冲突通过MobiLink的冲突分辨进程处理,这个进程通过SQL同步脚本处理。尽管客户端数据库可能是ASA或UltraLite,但是MobiLink是数据库服务器无关的,因为它通过ODBC执行所有的同步操作。同时我需要提醒你,所有的SQL脚本都要使用目标数据库的SQL风格编写(MobiLink作为Sybase、Oracle和DB2的示例发布)。

在客户端,每个ASA或UltraLite数据库都配置了特定的"发布"信息,它指定用于同步的MobiLink服务器(服务器版本、IP地址和端口)。最后,它提供了Java和C API,允许客户端通过本地TCP/IP或 HTTP触发同步。同时它也支持RSA和ECC加密以确保数据传递是安全的。

结论

在本文中我们讨论了移动数据库开发的技术。我们提供的这些基本信息对于帮助你作明智的决定可能有好处。当移动应用程序的结构体系和开发都正确的时候,它可以提供显著的投资回报,因为移动工作人员是最希望能与实际客户联系的雇员。

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus