到 Google 资讯主页   
EasyJF首页   资料   源码   软件    论坛   网站    
   使用帮助    
    该信息为本站MyRSS系统缓存内容,部分图片及附件有可能无法正常使用.easyjf.comwww.matrix.org.cn无关,不对该信息负责.通过http://www.matrix.org.cn//resource/article/0/669.html访问该信息的原始内容.
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   
高可靠性移动应用程序-移动数据库和J2ME工具(二)
作者:chris 来源:www.matrix.org.cn  发布时间:2006-02-22 17:48:44.703

<FONT size=2>翻译作者:jungleguo&nbsp;&nbsp;2003-11-15<BR>原文:&nbsp;<IMG src="http://www.matrix.org.cn/images/small/url.gif" align=absMiddle></FONT><A href="http://www.javaworld.com/javaworld/jw-06-2003/jw-0606-wireless-p2.html" target=_blank><FONT size=2>http://www.javaworld.com/javaworld/jw-06-2003/jw-0606-wireless-p2.html</FONT></A><BR><FONT size=2><STRONG>一个应用程序例子</STRONG><BR>现在通过一个简单的例子,我们检测一下移动数据库应用程序的典型用法和关键组件。<BR></FONT><FONT size=2><STRONG>移动联系管理器<BR></STRONG>这是一个由PointBase提供的移动联系管理器的例子。联系管理器&nbsp;contact&nbsp;manager包括在PointBase&nbsp;4.x中。为了读者方便,我已经把源代码打包成zip文件放在Resource中。如果你想编译和运行例子,你必须先从PointBase处下载适当的jar文件。<BR>这个应用程序本身比较简单。它主要沿用了高级地址本应用程序的通用特性。例如,它允许用户存储联系人名字,地址和电话号码;提供自觉浏览和搜索接口;和后台数据库服务器同步。图1和图2分别显示了该应用程序在标准模式和同步模式下的操作。这些屏幕快照来自一个由Insignia’s&nbsp;Jeode&nbsp;PersonalJava&nbsp;VM驱动的Pocket&nbsp;PC&nbsp;和一个由J2SE驱动的Mac&nbsp;OS&nbsp;X&nbsp;膝上型电脑。相同字节代码的应用程序没有经过修改运行在许多平台上,证明了Java的威力。<BR></FONT><A href="http://www.javaworld.com/javaworld/jw-06-2003/images/jw-0606-wireless1.gif" target=_blank><FONT size=2><IMG style="WIDTH: 267px; HEIGHT: 263px" height=200 alt="" hspace=0 src="http://www.javaworld.com/javaworld/jw-06-2003/images/jw-0606-wireless1.gif" width=200 border=0></FONT></A><BR><FONT size=2>图1&nbsp;在袖珍PC&nbsp;Jeode&nbsp;PersonalJava上的标准联系管理器<BR>&nbsp;</FONT><A href="http://www.javaworld.com/javaworld/jw-06-2003/images/jw-0606-wireless2-thumb.gif" target=_blank><FONT size=2><IMG style="WIDTH: 319px; HEIGHT: 271px" height=200 alt="" hspace=0 src="http://www.javaworld.com/javaworld/jw-06-2003/images/jw-0606-wireless2-thumb.gif" width=200 border=0></FONT></A><BR><FONT size=2>图2&nbsp;在Mac&nbsp;OS&nbsp;X上的两个同步的联系管理器spoke<BR>客户端应用程序UI(用户界面)是用AWT写的。这是被PersonalJava或J2ME/FP/PP设备所支持的唯一标准UI库。除了这些UI驱动,我们还有另一个代码层,它提供访问一般的设备上JDBC数据库。这个数据库访问层也提供了与后台服务器同步移动数据的逻辑,它是通过PointBase专有UniSync同步服务器来实现的。现在我们来看看数据访问层的代码,它包括在一个单独的类:DBManager.<BR></FONT><STRONG><BR><FONT size=2>设备上的数据访问</FONT></STRONG><BR><FONT size=2>类DBManager是一个单独的类,它提供从应用程序单点访问数据。这个单独模式避免了嵌入式数据库的线程复杂性。下面的代码片断显示了DBManager的构造器和初始化的代码。它连接数据库,定义表,将测试数据导入表中,创建为以后时候的SQL状态模版(PreparedStatement)。正如我们所看到的,这里用到的都是标准JDBC。对于企业Java&nbsp;开发者下面的代码应该很容易明白:<BR>例1&nbsp;连接移动数据库和初始化访问对象<BR></FONT>
<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1>
<TBODY>
<TR>
<TD style="WORD-WRAP: break-word"><FONT size=2>class&nbsp;DBManager&nbsp;{<BR>&nbsp;&nbsp;//&nbsp;DBManager&nbsp;is&nbsp;a&nbsp;singleton&nbsp;class.<BR>&nbsp;&nbsp;private&nbsp;static&nbsp;DBManager&nbsp;instance;<BR>&nbsp;&nbsp;private&nbsp;String&nbsp;driver;<BR>&nbsp;&nbsp;private&nbsp;String&nbsp;url;<BR>&nbsp;&nbsp;private&nbsp;String&nbsp;user;<BR>&nbsp;&nbsp;private&nbsp;String&nbsp;password;<BR>&nbsp;&nbsp;private&nbsp;boolean&nbsp;delay;<BR>&nbsp;&nbsp;private&nbsp;Connection&nbsp;connection;<BR>&nbsp;&nbsp;private&nbsp;Statement&nbsp;statement;<BR>&nbsp;&nbsp;private&nbsp;PreparedStatement&nbsp;insert;<BR>&nbsp;&nbsp;private&nbsp;PreparedStatement&nbsp;find;<BR>&nbsp;&nbsp;private&nbsp;PreparedStatement&nbsp;delete;<BR>&nbsp;&nbsp;private&nbsp;PreparedStatement&nbsp;update;<BR>&nbsp;&nbsp;private&nbsp;PreparedStatement&nbsp;all;<BR><BR>&nbsp;&nbsp;static&nbsp;DBManager&nbsp;getInstance()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(instance&nbsp;==&nbsp;null)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance&nbsp;=&nbsp;new&nbsp;DBManager();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;instance;<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;private&nbsp;DBManager()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Get&nbsp;parameters&nbsp;from&nbsp;runtime&nbsp;properties.<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;This&nbsp;allows&nbsp;us&nbsp;to&nbsp;switch&nbsp;to&nbsp;different&nbsp;JDBC&nbsp;databases<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;without&nbsp;changing&nbsp;the&nbsp;application&nbsp;code.<BR>&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;properties&nbsp;=&nbsp;ContactManager.getProperties();<BR>&nbsp;&nbsp;&nbsp;&nbsp;driver&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.getProperty("driver",&nbsp;"com.pointbase.me.jdbc.jdbcDriver");<BR>&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.getProperty("url",&nbsp;"jdbc:pointbase:micro:pbdemo");<BR>&nbsp;&nbsp;&nbsp;&nbsp;user&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.getProperty("user",&nbsp;"PBPUBLIC");<BR>&nbsp;&nbsp;&nbsp;&nbsp;password&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.getProperty("password",&nbsp;"PBPUBLIC");<BR>&nbsp;&nbsp;&nbsp;&nbsp;delay&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.getProperty("delayread","true").equals("true");<BR>&nbsp;&nbsp;&nbsp;&nbsp;connect();<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;private&nbsp;void&nbsp;connect()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Load&nbsp;the&nbsp;driver&nbsp;class.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(driver);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;If&nbsp;the&nbsp;database&nbsp;doesn't&nbsp;exist,&nbsp;create&nbsp;a&nbsp;new&nbsp;database.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection&nbsp;=&nbsp;DriverManager.getConnection(url,&nbsp;user,&nbsp;password);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Create&nbsp;template&nbsp;statement&nbsp;objects.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statement&nbsp;=&nbsp;connection.createStatement();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createStatement();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;If&nbsp;the&nbsp;database&nbsp;is&nbsp;newly&nbsp;created,&nbsp;load&nbsp;the&nbsp;schema.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;newdb=initDatabase();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Load&nbsp;sample&nbsp;data&nbsp;for&nbsp;the&nbsp;new&nbsp;tables.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(newdb)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SampleDataCreator.insert(connection);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;void&nbsp;disconnect()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.commit();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statement.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;find.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;//&nbsp;Create&nbsp;the&nbsp;table&nbsp;and&nbsp;load&nbsp;the&nbsp;schema.<BR>&nbsp;&nbsp;private&nbsp;boolean&nbsp;initDatabase()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql&nbsp;=&nbsp;"CREATE&nbsp;TABLE&nbsp;NameCard&nbsp;(ID&nbsp;INT&nbsp;PRIMARY&nbsp;KEY,&nbsp;"+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Name&nbsp;VARCHAR(254),&nbsp;Company&nbsp;VARCHAR(254),&nbsp;Title&nbsp;VARCHAR(254),&nbsp;"+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Address1&nbsp;VARCHAR(254),&nbsp;Address2&nbsp;VARCHAR(254),&nbsp;"+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Phone&nbsp;VARCHAR(254),&nbsp;Email&nbsp;VARCHAR(254),&nbsp;"+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Picture&nbsp;Binary(1000000))";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;If&nbsp;the&nbsp;table&nbsp;already&nbsp;exists,&nbsp;this&nbsp;will&nbsp;throw&nbsp;an&nbsp;exception.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statement.executeUpdate(sql);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;This&nbsp;means&nbsp;the&nbsp;database&nbsp;already&nbsp;exists.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Ignore&nbsp;the&nbsp;error&nbsp;-&nbsp;the&nbsp;table&nbsp;already&nbsp;exists,&nbsp;which&nbsp;is&nbsp;good<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;so&nbsp;we&nbsp;don't&nbsp;need&nbsp;to&nbsp;add&nbsp;demo&nbsp;data&nbsp;later&nbsp;on.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;//&nbsp;Create&nbsp;statement&nbsp;templates.<BR>&nbsp;&nbsp;private&nbsp;void&nbsp;createStatement()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert&nbsp;=&nbsp;connection.prepareStatement(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"INSERT&nbsp;INTO&nbsp;NameCard&nbsp;(ID,&nbsp;Name,&nbsp;Company,&nbsp;Title,&nbsp;Address1,&nbsp;"+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Address2,&nbsp;Phone,&nbsp;Email,&nbsp;Picture)&nbsp;"+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"valueS&nbsp;(?,&nbsp;?,&nbsp;?,&nbsp;?,&nbsp;?,&nbsp;?,&nbsp;?,&nbsp;?,&nbsp;?)");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;find&nbsp;=&nbsp;connection.prepareStatement(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT&nbsp;*&nbsp;FROM&nbsp;NameCard&nbsp;WHERE&nbsp;(Name&nbsp;LIKE&nbsp;?)&nbsp;"+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"AND&nbsp;(Company&nbsp;LIKE&nbsp;?)&nbsp;AND&nbsp;(Title&nbsp;LIKE&nbsp;?)&nbsp;"+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"AND&nbsp;((Address1&nbsp;LIKE&nbsp;?)&nbsp;OR&nbsp;(Address2&nbsp;LIKE&nbsp;?))&nbsp;"+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"AND&nbsp;(Phone&nbsp;LIKE&nbsp;?)&nbsp;AND&nbsp;(Email&nbsp;LIKE&nbsp;?)");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;=&nbsp;connection.prepareStatement(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"DELETE&nbsp;FROM&nbsp;NameCard&nbsp;WHERE&nbsp;ID&nbsp;=&nbsp;?");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update&nbsp;=&nbsp;connection.prepareStatement(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"UPDATE&nbsp;NameCard&nbsp;SET&nbsp;ID=?,&nbsp;Name=?,&nbsp;Company=?,&nbsp;Title=?,&nbsp;"+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Address1=?,&nbsp;Address2=?,&nbsp;Phone=?,&nbsp;Email=?,&nbsp;Picture=?&nbsp;"+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"WHERE&nbsp;ID&nbsp;=&nbsp;?");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;=&nbsp;connection.prepareStatement(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT&nbsp;ID,&nbsp;Name,&nbsp;Company,&nbsp;Title,&nbsp;Address1,&nbsp;Address2,&nbsp;"+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Phone,&nbsp;Email&nbsp;FROM&nbsp;NameCard");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;//&nbsp;Other&nbsp;methods.<BR><BR>}</FONT></TD></TR></TBODY></TABLE><FONT size=2>在DBManager中的其他方法通过简单JDBC&nbsp;API调用进行访问数据库。如下的代码片断展示了搜索和操纵名称卡片记录的方法。这些方法使用了我们之前定义的SQL模版。<BR>例2&nbsp;数据访问方法<BR></FONT>
<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1>
<TBODY>
<TR>
<TD style="WORD-WRAP: break-word"><FONT size=2>Vector&nbsp;findNameCardsByKeyword(String&nbsp;name,&nbsp;String&nbsp;company,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;title,&nbsp;String&nbsp;address1,&nbsp;String&nbsp;address2,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;phone,&nbsp;String&nbsp;email)&nbsp;{<BR>&nbsp;&nbsp;Vector&nbsp;NameCards&nbsp;=&nbsp;new&nbsp;Vector();<BR>&nbsp;&nbsp;String[]&nbsp;keywords&nbsp;=&nbsp;{name,&nbsp;company,&nbsp;title,&nbsp;address1,&nbsp;address2,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;phone,&nbsp;email};<BR>&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;keywords.length;&nbsp;i++)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;criteria&nbsp;=&nbsp;(keywords[i].equals(""))&nbsp;?&nbsp;"%"&nbsp;:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"%"&nbsp;+&nbsp;keywords[i]&nbsp;+&nbsp;"%";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;find.setString(i&nbsp;+&nbsp;1,&nbsp;criteria);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;resultSet&nbsp;=&nbsp;find.executeQuery();<BR>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(resultSet.next())&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NameCard&nbsp;nameCard&nbsp;=&nbsp;new&nbsp;NameCard(resultSet.getInt(1),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultSet.getString(2),&nbsp;resultSet.getString(3),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultSet.getString(4),&nbsp;resultSet.getString(5),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultSet.getString(6),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultSet.getString(7),&nbsp;resultSet.getString(8));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!delay)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadPicture(nameCard);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NameCards.addElement(nameCard);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return&nbsp;NameCards;<BR>}<BR><BR>void&nbsp;addNameCard(NameCard&nbsp;nameCard)&nbsp;{<BR>&nbsp;&nbsp;nameCard.setID(getNewID());<BR>&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;insert.setInt(1,&nbsp;nameCard.getID());<BR>&nbsp;&nbsp;&nbsp;&nbsp;insert.setString(2,&nbsp;nameCard.getName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;insert.setString(3,&nbsp;nameCard.getCompany());<BR>&nbsp;&nbsp;&nbsp;&nbsp;insert.setString(4,&nbsp;nameCard.getTitle());<BR>&nbsp;&nbsp;&nbsp;&nbsp;insert.setString(5,&nbsp;nameCard.getAddress1());<BR>&nbsp;&nbsp;&nbsp;&nbsp;insert.setString(6,&nbsp;nameCard.getAddress2());<BR>&nbsp;&nbsp;&nbsp;&nbsp;insert.setString(7,&nbsp;nameCard.getPhone());<BR>&nbsp;&nbsp;&nbsp;&nbsp;insert.setString(8,&nbsp;nameCard.getEmail());<BR>&nbsp;&nbsp;&nbsp;&nbsp;insert.setBytes(9,&nbsp;nameCard.getPicture().getBytes());<BR>&nbsp;&nbsp;&nbsp;&nbsp;insert.executeUpdate();<BR>&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}<BR>}<BR><BR>void&nbsp;updateNameCard(NameCard&nbsp;nameCard)&nbsp;{<BR>&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;update.setInt(1,&nbsp;nameCard.getID());<BR>&nbsp;&nbsp;&nbsp;&nbsp;update.setString(2,&nbsp;nameCard.getName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;update.setString(3,&nbsp;nameCard.getCompany());<BR>&nbsp;&nbsp;&nbsp;&nbsp;update.setString(4,&nbsp;nameCard.getTitle());<BR>&nbsp;&nbsp;&nbsp;&nbsp;update.setString(5,&nbsp;nameCard.getAddress1());<BR>&nbsp;&nbsp;&nbsp;&nbsp;update.setString(6,&nbsp;nameCard.getAddress2());<BR>&nbsp;&nbsp;&nbsp;&nbsp;update.setString(7,&nbsp;nameCard.getPhone());<BR>&nbsp;&nbsp;&nbsp;&nbsp;update.setString(8,&nbsp;nameCard.getEmail());<BR>&nbsp;&nbsp;&nbsp;&nbsp;update.setBytes(9,&nbsp;nameCard.getPicture().getBytes());<BR>&nbsp;&nbsp;&nbsp;&nbsp;update.setInt(10,&nbsp;nameCard.getID());<BR>&nbsp;&nbsp;&nbsp;&nbsp;update.executeUpdate();<BR>&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}<BR>}<BR><BR>void&nbsp;deleteNameCard(NameCard&nbsp;nameCard)&nbsp;{<BR>&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;delete.setInt(1,&nbsp;nameCard.getID());<BR>&nbsp;&nbsp;&nbsp;&nbsp;delete.executeUpdate();<BR>&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}<BR>}<BR><BR>void&nbsp;loadPicture(NameCard&nbsp;nameCard)&nbsp;{<BR>&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;resultSet&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statement.executeQuery(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT&nbsp;Picture&nbsp;FROM&nbsp;NameCard&nbsp;WHERE&nbsp;ID&nbsp;=&nbsp;"&nbsp;+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nameCard.getID());<BR>&nbsp;&nbsp;&nbsp;&nbsp;resultSet.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;Picture&nbsp;picture&nbsp;=&nbsp;new&nbsp;Picture();<BR>&nbsp;&nbsp;&nbsp;&nbsp;picture.setBytes(resultSet.getBytes(1));<BR>&nbsp;&nbsp;&nbsp;&nbsp;nameCard.setPicture(picture);<BR>&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}<BR>}<BR><BR>private&nbsp;int&nbsp;getNewID()&nbsp;{<BR>&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;resultSet&nbsp;=&nbsp;statement.executeQuery(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT&nbsp;MAX(ID)+1&nbsp;FROM&nbsp;NameCard");<BR>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(resultSet.next())&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;resultSet.getInt(1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return&nbsp;0;<BR>}</FONT></TD></TR></TBODY></TABLE><FONT size=2><STRONG>与后台数据库同步</STRONG><BR>类DBManager也允许应用程序开发者用PointBase&nbsp;专有UniSync引擎与后台数据库同步移动数据。不同的厂商使用不同的同步引擎,但他们的概念都是相类似的。同步过程按照如下这些步骤进行:<BR>1.&nbsp;在后台服务器和移动设备上创建相应的数据库和表<BR>2.&nbsp;在同步服务器上创建一个hub。这个hub包含发布信息。它指定和标识用于同步(发布)的后台表(或部分表)。<BR>3.&nbsp;使用hub来创建spoke。spoke是在同步服务器上表示移动设备的对象。每个spoke都有一个ID。它能通过在同一个hub里的订阅对象来订阅发布。通过使用一个spokeID,移动设备匹配spoke并对订阅的后台表进行同步。<BR>4.&nbsp;启动同步服务器。基本上通过com.pointbase.me.sync.Server&nbsp;类的main()方法来执行。这个服务器类用于PointBase&nbsp;发布包。还有其他几个方法在不同环境中运行服务器。您可以参考PointBase文档来得到更多的细节和例子。默认情况下,服务器监听端口8124。<BR>5.&nbsp;使用一个spokeID和在移动设备上的类&nbsp;spoke&nbsp;stub&nbsp;来初始化同步过程。<BR>&nbsp;</FONT><A href="http://www.javaworld.com/javaworld/jw-06-2003/images/jw-0606-wireless3.gif" target=_blank><FONT size=2><IMG style="WIDTH: 341px; HEIGHT: 221px" height=200 alt="" hspace=0 src="http://www.javaworld.com/javaworld/jw-06-2003/images/jw-0606-wireless3.gif" width=200 border=0></FONT></A><BR><FONT size=2>图3&nbsp;UniSync同步服务器框架图解<BR>例3&nbsp;中的类ResetServer显示了在UniSync服务器上如何创建hub和spoke:<BR>例3&nbsp;安装同步服务器<BR></FONT>
<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1>
<TBODY>
<TR>
<TD style="WORD-WRAP: break-word"><FONT size=2>manager=SyncManager.getInstance(caturl,catdriver,catuser,catpassword);<BR>String&nbsp;dsname;<BR>dsname=SyncDataSource.DEFAULT;<BR><BR>String&nbsp;hubname="Hub";<BR>Hub&nbsp;hub=manager.createHub(hubname);<BR><BR>Publication&nbsp;pub;<BR>String&nbsp;pubname;<BR>SpokeConfig&nbsp;spoke;<BR>Subscription&nbsp;sub;<BR>String&nbsp;subname="SubNameCard";<BR>String&nbsp;tablename="NAMECARD";<BR>String[]&nbsp;tables=new&nbsp;String[]{tablename};<BR><BR>//&nbsp;Publish&nbsp;the&nbsp;complete&nbsp;name-card&nbsp;table<BR>pubname="PubNameCard";<BR>pub=hub.newPublication(pubname,dsname,tables);<BR>hub.publish(pub);<BR><BR>//&nbsp;Create&nbsp;two&nbsp;spokes&nbsp;and&nbsp;subscribe&nbsp;to&nbsp;this&nbsp;publication<BR>for(int&nbsp;i=1;i&lt;=2;i++)&nbsp;{<BR>&nbsp;&nbsp;String&nbsp;name="Spoke"+i;<BR>&nbsp;&nbsp;spoke=hub.createSpokeConfig(name);<BR>&nbsp;&nbsp;spoke.savePassword("pass"+i);<BR>&nbsp;&nbsp;sub=spoke.newSubscription(subname,SyncDataSource.DEFAULT,pubname);<BR>&nbsp;&nbsp;spoke.subscribe(sub);<BR>}<BR><BR>//&nbsp;Publish&nbsp;the&nbsp;name-card&nbsp;table&nbsp;without&nbsp;the&nbsp;picture&nbsp;column<BR><BR>pubname="PubNameCardNoPicture";<BR>pub=hub.newPublication(pubname,dsname,tables);<BR>SyncTable&nbsp;table=pub.getSyncTable(tablename);<BR>table.dropSyncColumns(new&nbsp;String[]{"PICTURE"});<BR>hub.publish(pub);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>//&nbsp;Create&nbsp;two&nbsp;spokes&nbsp;and&nbsp;subscribe&nbsp;to&nbsp;this&nbsp;publication<BR>for(int&nbsp;i=3;i&lt;=4;i++)&nbsp;{<BR>&nbsp;&nbsp;String&nbsp;name="Spoke"+i;<BR>&nbsp;&nbsp;spoke=hub.createSpokeConfig(name);<BR>&nbsp;&nbsp;spoke.savePassword("pass"+i);<BR>&nbsp;&nbsp;sub=spoke.newSubscription(subname,SyncDataSource.DEFAULT,pubname);<BR>&nbsp;&nbsp;spoke.subscribe(sub);<BR>}<BR>manager.close();</FONT></TD></TR></TBODY></TABLE><FONT size=2>下面的DBManager代码片断显示了如何获得spoke&nbsp;stub&nbsp;和如何在设备上处理同步。代码中的注释解释了应用程序的同步和独立版本的不同:<BR>例4&nbsp;通过同步服务器访问数据<BR></FONT>
<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1>
<TBODY>
<TR>
<TD style="WORD-WRAP: break-word"><FONT size=2>//&nbsp;Import&nbsp;proprietary&nbsp;classes&nbsp;for&nbsp;sync<BR>import&nbsp;com.pointbase.me.jdbc.*;<BR><BR>class&nbsp;DBManager&nbsp;{<BR><BR>&nbsp;&nbsp;//&nbsp;In&nbsp;addition&nbsp;to&nbsp;JDBC&nbsp;connection&nbsp;variables,<BR>&nbsp;&nbsp;//&nbsp;we&nbsp;also&nbsp;need&nbsp;to&nbsp;define&nbsp;variables&nbsp;for&nbsp;sync<BR>&nbsp;&nbsp;//&nbsp;...&nbsp;...<BR>&nbsp;&nbsp;private&nbsp;Spoke&nbsp;spoke;<BR>&nbsp;&nbsp;private&nbsp;String&nbsp;spokename;<BR>&nbsp;&nbsp;private&nbsp;int&nbsp;spoke_id;<BR>&nbsp;&nbsp;private&nbsp;int&nbsp;spoke_range_start,spoke_range_end;<BR>&nbsp;&nbsp;final&nbsp;static&nbsp;int&nbsp;ROWS_PER_SPOKE=1&lt;&lt;16;<BR>&nbsp;&nbsp;private&nbsp;String&nbsp;syncurl;<BR>&nbsp;&nbsp;private&nbsp;String&nbsp;syncpassword;<BR><BR><BR>&nbsp;&nbsp;private&nbsp;DBManager()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Get&nbsp;DB&nbsp;connection&nbsp;parameters<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...&nbsp;...<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Get&nbsp;sync&nbsp;parameters<BR>&nbsp;&nbsp;&nbsp;&nbsp;syncurl&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.getProperty("syncurl",&nbsp;"<IMG src="http://www.matrix.org.cn/images/small/url.gif" align=absMiddle></FONT><A href='http://localhost:8124"/' target=_blank><FONT size=2>http://localhost:8124"</FONT></A><FONT size=2>;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;spokeid&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.getProperty("spokeid",&nbsp;"1");<BR>&nbsp;&nbsp;&nbsp;&nbsp;spokename&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.getProperty("spoke",&nbsp;"Spoke"+spokeid);<BR>&nbsp;&nbsp;&nbsp;&nbsp;syncpassword&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.getProperty("syncpassword",&nbsp;"pass"+spokeid);<BR>&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.getProperty("url",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"jdbc:pointbase:micro:pbdemo"+spokeid);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;connect();<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;//&nbsp;The&nbsp;complete&nbsp;connect&nbsp;method&nbsp;using&nbsp;synchronization&nbsp;server<BR>&nbsp;&nbsp;private&nbsp;void&nbsp;connect()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Connecting&nbsp;to&nbsp;the&nbsp;database...");<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(driver);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;If&nbsp;the&nbsp;database&nbsp;doesn't&nbsp;exist,&nbsp;create&nbsp;a&nbsp;new&nbsp;database<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection&nbsp;=&nbsp;DriverManager.getConnection(url,&nbsp;user,&nbsp;password);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statement&nbsp;=&nbsp;connection.createStatement();<BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Check&nbsp;sync&nbsp;metadata&nbsp;and&nbsp;create&nbsp;tables<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadMeta();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Create&nbsp;prepared&nbsp;statements<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createStatement();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;//&nbsp;The&nbsp;complete&nbsp;newID&nbsp;method&nbsp;using&nbsp;the&nbsp;sync&nbsp;server<BR>&nbsp;&nbsp;private&nbsp;int&nbsp;getNewID()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;statement.executeQuery(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT&nbsp;MAX(ID)+1&nbsp;FROM&nbsp;NameCard&nbsp;WHERE&nbsp;"+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ID&gt;="+spoke_range_start+"&nbsp;AND&nbsp;ID&lt;"+spoke_range_end);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;id=rs.getInt(1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rs.wasNull())&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;spoke_range_start;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;id;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;//&nbsp;Create&nbsp;table&nbsp;and&nbsp;load&nbsp;metadata&nbsp;from&nbsp;the&nbsp;sync&nbsp;hub<BR>&nbsp;&nbsp;void&nbsp;loadMeta()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SyncManager&nbsp;manager=SyncManager.getInstance(connection);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spoke=manager.getSpoke(spokename);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(spoke==null)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Loading&nbsp;MetaData&nbsp;from&nbsp;url&nbsp;"+syncurl+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;for&nbsp;spoke&nbsp;"+spokename+<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;using&nbsp;password&nbsp;"+syncpassword);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spoke=manager.createSpoke(spokename);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spoke.savePassword(syncpassword);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spoke.saveHubURL(syncurl);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spoke.loadConfig();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spoke.getSnapshot();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spoke_id&nbsp;=&nbsp;spoke.getSpokeId();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("SpokeID&nbsp;is&nbsp;"+spoke_id);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spoke_range_start&nbsp;=&nbsp;ROWS_PER_SPOKE&nbsp;*&nbsp;spoke_id;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spoke_range_end&nbsp;=&nbsp;&nbsp;spoke_range_start&nbsp;+&nbsp;ROWS_PER_SPOKE&nbsp;-&nbsp;1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SyncException&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;//&nbsp;Synchronize&nbsp;spoke&nbsp;databases&nbsp;(mobile&nbsp;databases)&nbsp;with&nbsp;the&nbsp;hub<BR>&nbsp;&nbsp;//&nbsp;and&nbsp;backend&nbsp;databases<BR>&nbsp;&nbsp;void&nbsp;sync()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spoke.sync();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SyncException&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;//&nbsp;Other&nbsp;data&nbsp;access&nbsp;methods&nbsp;are&nbsp;the&nbsp;same&nbsp;as&nbsp;the&nbsp;non-synced&nbsp;version.<BR>}</FONT></TD></TR></TBODY></TABLE>

 
相关文章
 
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   


EasyJF.com 2006 隐私政策 使用EasyJF前必读