持久数据和记录管理系统( record management system,简称 rms)
midp提供在移动设备上存储持久数据的支持,并且 mid简表还特意规定兼容的移动设备必须提供至少 8kb的非动态内存用于数据存储的用途,时式上,大多数的 midp java设备提供的空间比这要求多得多。这就允许一个midlet充份利用应用程序的持久数据。对于有 java 2标准版开发经验的开发者,应该注意这种数据存储能力与标准的 java有区别。j2me记录管理系统 ( rms )允许数据流被储存并且在一个记录基础上访问数据。由应用程序开发者把每个记录解析到字段水平。rms程序包内部的接口支持一个应用程序定义的基础上的比较与检索功能。
一、javax.microedition.rms程序包
通过 javax.microedition.rms包访问 j2me记录管理系统,这个包包括一个类, recordstore,和好几个有用的接口 (在下列表格中描述 ):
| 接口 | 描述 |
| recordcomparator | 一个接口,定义一个比较机制,比较两个记录(以一个实现定义的方式)看它们是否匹配或它们的相对排序次序是什么样的。 |
| recordenumeration | 一个接口,一个双向的纪录模拟器 |
| recordfilter | 一个接口,定义了一个过滤器用于检查一个记录,看其是否匹配 (基于一种应用程序定义的标准 )。 |
| recordlistener | 一个监听者接口,从一个记录存储器中接受记录更改/添加/删除事件。 |
| recordstore rs = null; rs = recordstore.openrecordstore("testrecordset", true); |
| 参数 | 描述 |
| byte[] data | 一个储存在记录中的字节数据数组,通过 java.io.bytearrayoutputstream和 java.io.dataoutputstream类把数据添加到这个字节数组。 |
| int offset | 进入这个记录第一个关联字节数据缓冲区的索引。 |
| int numbytes | 用于记录的数据缓冲区的字节数 |
一旦成功完成 addrecord()调用 ,这个方法就返回一个整数指定这个记录在记录存储中的标识号。 recordstore还规定另外一个数据编辑方法,包括 setrecord()和 deleterecord(),但是我在例子中不会使用它们。
三、构建一个用于j2me设备的通讯录
这个例子构造一个基本的通讯录应用程序,使用它用户就可以从一个移动设备上查看联络资料。现在我只介绍从本地设备中存储的数据中读出相关的联络资料,在本文稍后的部分,你将看到如何使用j2me网络功能从一个 web服务器取回数据文件!用户将能查看一个地址列表和从这个列表选择一个地址。为了实现这个目标,我们要创建两个类,从用户界面逻辑中把数据存取逻辑分开的: addressdb类封装所有的 rms代码; addressbookmidlet类封装 gui代码。addressdb类的代码如下:
| import javax.microedition.rms.*;import java.io.bytearrayinputstream; import java.io.bytearrayoutputstream; import java.io.datainputstream; import java.io.dataoutputstream; import java.io.eofexception; import java.io.ioexception; public class addressdb { private static recordstore rs = null; public addressdb() { try { rs = recordstore.openrecordstore("addressbook", true); } catch (recordstoreexception e) { system.out.println(e); e.printstacktrace(); } } public void addaddress(string name, string address) { bytearrayoutputstream os = new bytearrayoutputstream(); dataoutputstream output = new dataoutputstream(os); try { output.writeutf(name + "," + address); } catch (ioexception e) { system.out.println(e); e.printstacktrace(); } byte[] b = os.tobytearray(); try { rs.addrecord(b, 0, b.length); } catch (recordstoreexception e) { system.out.println(e); e.printstacktrace(); } } public static string getname(int index) { int counter = 1; int commalocation = 0; string name = null; try { recordenumeration enumrec = rs.enumeraterecords(null, null, false); while ((counter <= index) && (enumrec.hasnextelement())) { string strtemp = new string(enumrec.nextrecord()); commalocation = strtemp.indexof(','); name = strtemp.substring(2, commalocation); counter++; } } catch (exception e) { system.out.println(e); e.printstacktrace(); } return name; } public static string getaddress(int index) { int counter = 1; int commalocation = 0; string address = null; try { recordenumeration enumrec = rs.enumeraterecords(null, null, false); while ((counter <= index) && (enumrec.hasnextelement())) { string strtemp = new string(enumrec.nextrecord()); commalocation = strtemp.indexof(','); address = strtemp.substring(commalocation + 1); counter++; } } catch (exception e) { system.out.println(e); e.printstacktrace(); } return address; } public static int recordcount() { int count = 0; try { count = rs.getnumrecords(); } catch (exception e) { system.out.println(e); e.printstacktrace(); } return count; } } |
addressdb类包含好几个 public访问方法,它们都对来自外部调用者的访问隐藏记录存储的细节。addressdb()构造程序调用 recordstore.openrecordstore(),正如前面讨论的那样。我也创建了四个助手方法用于访问基层记录存储: recordcount()、 getaddress()、 getname()和 addaddress()。注意,在本例子中addaddress()方法只是在 name/address字段之间放了一个逗号。同样地, getaddress()和getname()从记录存储中取回 name/address字段。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器