J2ME中的记录管理系统(RMS)之一

翻译 2006年05月22日 21:26:00

表(MIDP

第一部分:理解记录管理系统(RMS

MIDP的一个重要子系统是RMS,它是一个提供设备上本地数据持续性给MIDP应用程序的API。现今,在大部分支持MIDP的设备上,RMS是本地数据存储的唯一工具---极少有设备支持传统的文件系统。那么,正如你所设想的,对于编写任何依赖本地永久性数据的应用程序来说,对RMS的全面理解都是至关重要的。

这篇文章是探究RMS及围绕其在MIDP应用程序中使用的更多问题的系列文章中的第一篇,这些问题包括诸如同外部数据源(比如关系型数据库)交互等问题。作为开始,我们将研究RMS需要提供些什么以及编写一些简单的调试工具。

 

重要的概念

首先你需要理解RMS的一些重要概念。

 

记录

如同你从它的名字中所推断的一样,RMS是一个管理纪录的系统。一条记录是一个独立的数据项。RMS对于记录中包含什么没设限制:一条记录可以包含一个整型数,一个字符串,一个数组或是一副图片----任何一个字节序列可以代替的东西。如果你能创建你的数据的二进制编码以及相应的解码,那么你就可以将它存储在一条记录中,当然它要受制于系统施加的尺寸大小约束。

许多RMS的初学者都被术语“record”所迷惑。他们想知道系统是怎样将单个的记录细分为离散的数据序列,于是问道:“域在哪里?”。答案很简单:RMS中记录没有任何域。或者更准确地说,一条记录由一个可变长度的单一二进制域组成。解释记录内容的责任就完全落在了应用程序身上。RMS提供存储和一个唯一的标志符,再没其他东西了。尽管这种工作的分工使应用程序复杂化,但它令RMS小而灵活----对于一个MIDP子系统来说这是很重要的特性。

API层面上,记录只不过就是字节数组。

 

记录仓库

记录仓库是记录的有序集合。记录不是独立的实体:每一条记录都必须属于一个记录仓库,并且所有的记录访问都经由记录仓库。事实上,记录仓库保证了记录被读取与写入时的原子性,而不会有数据变坏的可能性。

记录被创建的时候,记录仓库分配给它一个唯一的标志符----一个叫做记录ID的整型数。第一个被加进记录仓库的记录的记录ID1,第二个为2,等等。记录ID不是索引。删除记录不会使现存记录被重新编号或者影响下一个记录ID的值。

MIDlet套件中使用名字来识别记录仓库。一个记录仓库的名字可以包含1~32Unicode字符,而且在创建记录仓库的MIDlet套件中它必须是唯一的。在MIDP1.0中,记录仓库不可以被不同的MIDlet套件所共享。MIDP2.0可以随意地允许一个MIDlet套件同其他MIDlet套件共享一个记录仓库,这种情况下记录仓库通过MIDlet套件的名字和它的提供者连同记录仓库的名字本身来标识。

记录仓库还维持一个time-stamp和版本信息,那样应用程序就能够发现记录仓库是什么时候被修改的。为了更进一步的跟踪,应用程序可以注册一个监听器,任何时候记录仓库被修改时就通知它。

API层面上,一个记录仓库被一个javax.microedition.rms.RecordStore类的实例所代表。所有的RMS类和接口都是在javax.microedition.rms包中定义的。

 

 

在看代码之前,让我们先回顾关于RMS的重要信息

 

存储限制

供基于记录存储用的可用存储空间的大小随不同的设备而不同。MIDP规范要求设备为永久数据存储预留至少8K大小的非易失性存储空间。规范对于单个记录的大小没有任何限制,但是空间的约束随不同的设备而不同.RMS为决定单个记录的大小、记录仓库的总大小和存储数据的存储器还剩多少提供了方法。记住:永久性存储器是共享的稀有资源,所以使用时要节俭。

任何使用RMSMIDlet套件都应该通过在JAR清单和应用程序描述符中设定MIDlet-Data-Size属性的方式详细说明它所需要的数据存储空间的最小字节数目。不要把这个值设置得比绝对需求大,因为设备可能会拒绝建立数据存储需求超过可用空间大小的MIDlet套件。如果这个属性丢了,设备会假定MIDlet套件不需要数据存储空间。实践中,大多数设备允许应用程序超出它们规定的空间要求,而不会依赖于这种规定。

注意:一些MIDP实现会要求你定义另外的与存储要求相关的属性----查看设备文件以了解详情。

 

速度

通常在永久性存储器上的操作会比在易失性存储器上的相当操作花更多的时间。特别地,在某些平台上,写数据会花很长的时间。为了获得更好的性能,高速缓存在易失性存储器中频繁地存取数据。为了使用户界面保持响应,不要执行来自MIDlet事件线程的RMS操作。

 

线程安全

RMS操作是线程安全的,但是线程一定还要同其他任何共享资源一样,将数据的读取与写入调整到同一个记录仓库中。这种调整的要求适用于运行在不同MIDlet中的线程,因为在同一个MIDlet套件中记录仓库是共享的。

 

异常

一般说来,RMS API中的方法除了会抛出如java.lang.IllegalArgumentException标准运行时异常之外,也会抛出一个或更多的被选中的异常。RMS异常都是javax.microedition.rms包的组成部分。

当操作因记录ID不合法而不能执行时,InvalidRecordIDException异常会被抛出。

当记录仓库中没有更多的可用空间时,RecordStoreFullException异常会被抛出。

当应用程序试图打开不存在的记录仓库时,RecordStoreNotFoundException异常会被抛出。

当应用程序试图访问已经被关闭的记录仓库时,RecordStoreNotOpenException异常会被抛出。

RecordStoreException是上面四个异常的超类,当发生上面四个所不能覆盖的一般错误是它被抛出。

注意,简短起见,在这些系列文章的一些代码样例中,异常的处理被简化或省略掉了。

(待续。。。)

原文出处:

http://developers.sun.com/techtopics/mobility/midp/articles/databaserms/index.html

相关文章推荐

j2me RMS记录管理系统 备忘录

  • 2010年04月07日 21:11
  • 35KB
  • 下载

J2ME中使用记录存储系统(RMS)存储信息

 在MIDP中,没有文件的概念,所以永久存储一般只能依靠记录存储系统实现,关于记录存储系统的简介,可以参看教程:http://www-900.ibm.com/developerWorks/cn/jav...
  • pdw_jsp
  • pdw_jsp
  • 2011年02月09日 13:51
  • 299

J2ME 101,第 3 部分: 深入记录管理系统

J2ME 101,第 3 部分: 深入记录管理系统 发布者:IBM   日期:2004-01-22 00:00:00 浏览次数:0 (共有_条评论...

手机成绩管理系统 j2me

  • 2012年05月14日 21:04
  • 73KB
  • 下载

基于J2ME的课程管理系统(源代码)

  • 2009年12月28日 14:41
  • 867KB
  • 下载

J2ME从服务器端下载图片,在RMS中存储,然后在读取显示(非原创代码,整合应用而已)

package com.zeph.j2me.rsm.image; import java.io.DataInputStream; import java.io.DataOutputStream...

j2me学习八_线程动画及rms

线程动画: import javax.microedition.lcdui.Canvas;import javax.microedition.lcdui.Display;import javax.mi...

J2ME RMS 永久存储 操作

终于实现J2ME永久存储,对上一篇文章中所说的不能永久存储的自我否定!  package j2me; import javax.microedition.rms.RecordEnumeratio...

J2ME RMS 对象序列化存储

需要在手机上保存很多好友的信息,每个Friend对象定义有Family,Name,Given Name,Age,Telephone等若干属性。RMS中引入对象序列化。所谓对象序列化,就是将对象的状态转...

Server 2012 R2 RMS文档管理系统

ADRMS如何在一个机构内运作650) this.width=650;" style="background-image:none;padding-left:0px;padding-right:0px...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:J2ME中的记录管理系统(RMS)之一
举报原因:
原因补充:

(最多只允许输入30个字)