|
<script type="text/javascript"></script>
|
|
|
<noscript></noscript>
<script type="text/javascript"></script>
|
|
|
<noscript></noscript>
|
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
|
级别: 初级
Soma Ghosh (sghosh@entigo.com), 应用程序开发者, Entigo
2002 年 8 月 21 日
移动信息设备框架(Mobile Information Device Profile)― 移动 Java 应用程序的平台 ― 为 MIDP 应用程序提供一种跨多个调用持久存储数据的机制。这种持久存储机制可以被视为一种简单的面向记录的数据库模型,被称为记录管理系统(record management system(RMS))。在此,Soma Ghosh 说明了您的 J2ME 应用程序怎样能够使用 RMS 来管理和解释数据。通过一个样本电话数据库,您还将了解到关于这个概念的说明。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
J2ME 记录管理系统
J2ME 记录管理系统(RMS)提供了一种机制,通过这种机制,MIDlet 能够持久存储数据,并在以后检索数据。在面向记录的方法中,J2ME RMS 由多个 记录存储构成。J2ME RMS 和 MIDlet 接口连接的概貌在图 1 中给出。
图 1. J2ME RMS 和 MIDlet 接口连接的概貌
可以将每个记录存储想像成一个记录集合,它将跨多个 MIDlet 调用持久存在。设备平台负责在平台正常使用的整个过程(包括重新启动、换电池等)中,尽全力维护 MIDlet 的记录存储的完整性。
记录存储在与平台相关的位置(比如非易失性设备存储器)创建,这些位置不直接公开给 MIDlet。RMS 类调用特定于平台的本机代码,这种本机代码使用标准 OS 数据管理器函数来执行实际的数据库操作。
记录存储实现确保所有单个的记录存储操作都是原子的、同步的以及序列化的,因此多个访问将不会出现数据毁坏。记录存储被盖上时间戳来指示它上次被修改的时间。记录存储还维护 版本(version),它是一个整数,修改记录存储内容的操作每发生一次,这个数加一。版本和时间戳对于同步目的很有用。
当 MIDlet 使用多个线程访问一个记录存储时,协调该访问是 MIDlet 的责任;如果它不能这样做,可能出现无法意料的结果。同样,如果一个平台使用试图同时访问记录存储的多个线程执行记录存储的同步,那么对 MIDlet 及其同步引擎之间的记录存储实施排外访问是平台的责任。
记录存储中的每个记录是一个字节数组,并且有唯一的整数标识符。
管理设备数据库
javax.microedition.rms.RecordStore 类代表 RMS 记录存储。它提供了几个方法来管理以及插入、更新和删除记录存储中的记录。
管理记录存储
要打开一个记录存储,调用 javax.microedition.rms.RecordStore 的 openRecordStore() 方法。 public static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary) 打开具有指定名称 recordStoreName 的记录存储。如果没有具有这个名称的记录存储,那么调用这个方法来创建一个。
如果记录存储已经打开,这个方法将返回对同一个记录存储对象的引用。
清单 1. 打开一个 RecordStore
RecordStore rs = RecordStore.openRecordStore("MyAppointments",true);
|
一旦所有操作完成,对 closeRecordStore() 的调用将关闭指定名称的记录存储。当一个记录存储被关闭时,不能进行进一步的操作。
清单 2. 关闭一个 RecordStore
通过调用 deleteRecordStore() 方法可以删除指定名称的记录存储。
清单 3. 删除一个 RecordStore
RecordStore.deleteRecordStore("MyAppointments");
|
插入记录
MIDlet 调用 javax.microedition.rms.RecordStore 类的 addRecord() 方法来将一条新记录插入到记录存储中。这是阻塞的原子操作,并返回新记录的 recordId 。在这个方法返回之前,记录被写到持久存储中。
public int addRecord(byte[] data, int offset, int numBytes) 插入一条由字节数组 data 代表的记录,这个数组以 offset 作为它的起始索引, numBytes 作为它的长度。
清单 4. 插入一条记录
String appt = "new record";
byte bytes[] = appt.getBytes();
rs.addRecord(bytes,0,bytes.length);
|
更新记录
更新一条特殊记录包括获取这个记录的句柄以及设置新信息。
public int getRecord(int recordId, byte[] buffer, int offset) 返回存储在由 buffer 代表的字节数组中给定记录的数据。 public byte[] getRecord(int recorded) 返回由 recordId 代表的数据的副本。 public void setRecord(int recordId, byte[] newData, int offset, int numBytes) 在 recordId 所代表记录的位置设置新信息,新信息是以 offset 作为它的起始索引,并以 numBytes 作为它的长度的字节流( newData )。
清单 5. 更新一条记录
String newappt = "update record";
Byte data = newappt.getBytes();
Rs.setRecord(1, data, 0, data.length());
|
删除记录
MIDlet 调用 deleteRecord() 方法来从记录存储中删除记录。
public void deleteRecord(int recordId) 删除由 recordId 代表的记录。这个记录的 recordId 接下来不能重用。
清单 6. 删除一条记录
数据解释
J2ME API 提供某种接口来解释存储在记录存储中的数据。这个过程包括比较记录来确定它们的相对排序。它还包括根据给定条件的内容过滤。
比较记录
MIDlet 实现 RecordComparator 接口,并定义 compare (byte[] rec1, byte[] rec2) 方法来比较两个候选记录。这个方法的返回值必须指示这两条记录的顺序。
清单 7. 比较记录并确定相对排序
Int compare (byte[] b1, byte[] b2)
{
String s1 = new String(b1);
String s2 = new String(b2);
If (s1.compareTo(s2) > 0)
Return RecordComparator.FOLLOWS;
Else if (s1.compareTo(s2) == 0)
Return RecordComparator.EQUIVALENT;
Else
Return RecordComparator.PRECEDES;
}
|
枚举记录
RecordEnumeration 接口负责枚举记录存储中的记录。它逻辑上维护记录存储中一连串的记录的 recordId 。枚举器将以记录比较器确定的顺序迭代所有记录(或者如果提供了一个可选的记录过滤器,那么只是一个子集)。如果既没有指定过滤器又没有指定比较器,枚举将以未定义的顺序遍历记录存储中的所有记录。
清单 8. 枚举记录
RecordEnumeration re = rs.enumerateRecords(null, null, false);
If (re.hasNextElement())
Byte nextRec[] = re.nextRecord();
|
过滤记录
MIDlet 实现 RecordFilter 接口,定义检查记录是否满足应用程序定义的标准的过滤器。这个应用程序实现 RecordFilter 的 match() 方法来选择 RecordEnumeration 返回的记录。
清单 9. 过滤记录
Public boolean matches(byte[] candidate)
{
String s1 = new String(candidate);
If (s1.equals("XX"))
Returns true;
Else
Returns false;
}
|
开发电话约会簿
在这部分,我们将通过构建一个电话约会簿来说明 J2ME RMS 的功能。这个应用程序将允许用户设置某个日期和时间的约会,取消约会或查看已经设置好的约会列表。一个快捷屏幕视图如图 2 所示。
图 2. 工作中的电话约会簿
构成这个应用程序的各种屏幕以及屏幕元素的用户界面元素的完整列表在与 J2ME Wireless Toolkit 一起提供的 MID 框架 API 文档中可以得到;要获取关于这些元素的更多详细信息,请查阅我早些时候给 developerWorks写的一篇文章(请参阅下面的 参考资料部分以获取这两个链接)。
记录存储可以以字节流形式存储记录。在我们的应用程序中,用户输入的日期和时间被连接成一个字符串,转换成字节,然后被存储。
清单 10. 将一个新的约会添加到数据库中
Public boolean matches(byte[] candidate)
String appt = apptName + " " + apptTime;
byte bytes[] = appt.getBytes();
rs.addRecord(bytes,0,bytes.length);
|
同样,这个应用程序以字节流形式检索记录,然后将它转换成一个字符串。这个字符串以 ####AAAA 格式,其中 # 表示代表时间信息的数字,AAAA 表示代表约会描述的字符。这个应用程序解析这个字符串来获得日期和时间信息,并以用户所希望的格式显示它们,比如 description - mm/dd/yyyy hh:mm AM_PM 。
清单 11. 从记录存储检索一条记录
byte b[] = rs.getRecord(j);
String str = new String(b,0,b.length);
|
清单 12. 解析从记录存储获得的数据,然后以用户所希望的格式显示
if (Character.isDigit(str.charAt(i)))
at += str.charAt(i);
else
name += str.charAt(i);
time = Long.parseLong(at);
java.util.Date date = new java.util.Date(time);
java.util.Calendar rightNow = java.util.Calendar.getInstance();
rightNow.setTime(date);
String year = String.valueOf
(rightNow.get(java.util.Calendar.YEAR));
String month = String.valueOf
(rightNow.get(java.util.Calendar.MONTH) + 1);
String day = String.valueOf
(rightNow.get(java.util.Calendar.DATE));
String displayName = name
+ "-" + year + " " + day;
|
用户被允许从记录存储中选择某种约会以及将它们从记录存储中删除。因为为了维持记录中原始的顺序所删除的 recordId 不能重用,所以这个记录通过特有的字符串模式标记为无效。
清单 13. 将一条记录标记为已删除
String deactive = "@";
byte b[] = deactive.getBytes();
rs.setRecord(m+1, b,0,b.length);
|
当这个应用程序显示一个约会列表时,它检测那些无效记录的字符串模式,然后跳过它们。
清单 14. 跳过无效记录
if (!(str.startsWith("@")))
{
// Record is valid
}
else
{
// Record is invalid.
}
|
这个应用程序的一个重要的方面是用户界面。各种屏幕有下面这些:
-
欢迎表单:欢迎表单显示一个已经设置好的约会列表,如果没有设置约会,则通知用户。它提供继续或退出这个应用程序的各种选项。
-
菜单表单:菜单表单给用户提供查看约会、设置新约会或取消约会等选项。
-
显示表单:显示表单显示已经设置好的约会列表。
-
设置表单:设置表单提供一个日期选择域和一个输入文本域,以提供新约会的详细信息。当用户选择保存时,这条信息被存储到数据库中。
-
删除表单:删除表单列出一组约会,并提供选择一个或多个的选项。如果用户选择删除,所选择的这组约会在记录存储中被标记为无效。
应用程序实现使自己能够响应各种事件的 CommandListener 和 ItemStateListener 接口。 ItemStateListener 使应用程序能够接收指示下面这些东西的内部状态的改变的事件:
-
DateField ,一个显示日期和时间的可编辑组件
-
TextField ,一个可编辑文本组件
-
ChoiceGroup ,一组可选择的元素
清单 15. 从屏幕获取值
// The date value is set to a variable when the
// DateField item is changed
if (item == apptDate)
{
date = apptDate.getDate();
apptTime = String.valueOf(date.getTime());
}
// The name of appointment is set to a variable
//when the name input field is changed
if (item == apptField)
{
apptName = apptField.getString();
}
// If the ChoiceGroup item state on Delete form is
//changed, it sets an array of appointments selected for deletion
if (item == cg)
{
cg.getSelectedFlags(deleted);
}
|
清单 16包含这个样本应用程序的完整清单。请参阅 参考资料部分中我以前的一篇关于 J2ME 的文章,以获取关于下载将使您能够在桌面上运行这个程序的设备仿真器的指导。
总结
在本文中,我们讲述了 MID 应用程序持久存储和检索数据的能力;这种机制根据简单的面向记录的数据库建模。J2ME API javax.microedition.rms 包提供了一个开发者的方法和接口宝库,从而可以利用 MID 应用程序的这种独特功能。现在,您应该能够将数据存储集成到您自己的微型 Java 应用程序中了。
|
相关推荐
在Java Micro Edition (J2ME) 平台上,开发针对移动设备的应用时,有时需要处理与电话相关的功能,比如读取、储存电话记录。...通过理解这些基本概念,开发者可以创建自己的J2ME应用来管理和储存电话记录。
在本文中,我们将深入探讨基于J2ME的RMS(Record Management System)记录管理系统,特别关注如何在S60及更高版本的移动设备上实现一个备忘录应用。这个系统对于初学者来说是一个很好的学习资源,因为它展示了如何...
在J2ME(Java 2 Platform, Micro Edition)平台上实现记录管理存储(Record Management System,简称RMS)是一项核心技能,对于开发移动设备上的应用程序至关重要。J2ME为MIDP(Mobile Information Device Profile)...
如果你已经从头开始学习这一...在本文中,我们将通过MIDP的记录管理系统(RMS)来为ExpensesApp MIDlet组件创建一个记录存储器来解决上述问题。我们将会把ExpensesApp增强到记录库的程度,这将使得该应用程序是有用的。
总结来说,RMS是J2ME中存储数据的重要工具,通过理解单一记录的构造以及RecordStore的操作,开发者能够有效地管理应用程序的数据存储,实现游戏状态的保存、用户数据的持久化等功能。正确地使用RMS是开发J2ME应用不...
在这个“J2ME手机电话记录存储”项目中,我们将探讨如何利用J2ME技术来实现一个简单的手机电话簿功能,包括添加、删除、修改和查询联系人的电话记录。 首先,我们需要理解J2ME的基本架构。J2ME由配置...
在Java Micro Edition (J2ME) 平台上,记录存储(Record Store) 是一个重要的功能,用于在设备上持久化数据。...实际开发时,你可以根据具体需求调整和扩展这些基本操作,构建更复杂的记录管理系统。
**J2ME生活管理软件详解** Java 2 Micro Edition(J2ME)是Java平台的一个重要组成部分,专门设计用于资源有限的嵌入式设备,如移动电话、智能家电和手持设备。这款“J2ME生活管理软件”充分利用了J2ME的特性,旨在...
在 J2ME 中,Record Management System (RMS) 是一个内置的数据存储机制,用于在没有持久化数据库支持的情况下保存应用程序的数据。下面将详细介绍如何使用 RMS 框架来保存记录以及封装 RMS 类的方法。 1. **RMS ...
J2ME,全称Java 2 Micro...综上所述,这个J2ME项目可能涉及到创建和管理Record Store,存储和检索数据,以及可能的文件操作。通过学习和理解这些知识点,开发者可以构建自己的J2ME应用程序,实现手机上的数据存储功能。
总的来说,这个用J2ME编写的电话簿程序展示了如何在有限的移动设备环境中,利用RMS高效、可靠地存储和管理数据。虽然现代移动设备更多采用更强大的平台和存储解决方案,但理解J2ME和RMS的工作原理对于学习移动应用...
这个标题“J2ME简单读写存储电话本源代码”表明我们将探讨如何使用J2ME进行电话本功能的开发,包括读取、写入和管理联系人数据。对于初学者来说,了解这些概念是深入理解手机应用开发的关键。 在J2ME中,我们通常会...
1. **数据存储**:在J2ME中,通常使用Record Management System (RMS)来存储数据,比如电话记录的日期、时间、来电/去电号码、通话时长等。RMS允许开发者创建自己的数据库,虽然它的功能相对简单,但对于小型应用而...
在 J2ME 中,数据记录库(Record Management System,RMS)是用于存储应用程序数据的一个简单但实用的机制。RMS 提供了类似于数据库的功能,但其设计是为了适应资源有限的移动环境。 标题“j2me数据记录库的源代码...
**J2ME RMS数据存储详解** 在Java Micro Edition (J2ME) 平台中,Resource Management System (RMS) 是一种用于存储应用程序数据的重要机制。由于J2ME主要用于资源有限的移动设备,如手机和掌上电脑,RMS提供了一种...
8. **数据存储**:J2ME中的记录管理存储系统(RMS)提供了基本的数据存储功能,允许应用程序在设备本地保存数据。 9. **游戏开发**:J2ME因其跨平台特性和低内存需求,成为早期移动游戏开发的热门选择。MIDP提供了...
RMS操作通常涉及创建记录存储、记录集管理以及读写数据等步骤。开发者可能通过RecordStore类创建并访问数据存储,通过RecordEnumeration遍历和处理数据。 成绩管理系统的用户界面可能由多个Screen组成,每个Screen...