2026年10月31日 · 今日 0 帖 · 会员 6.1万 · 主题 17.4万
登录 · 注册 · 游客,欢迎随便逛逛
返回版块
49789
Lv8能识八方语等级图标等级图标等级图标等级图标等级图标等级图标
勋章勋章勋章勋章勋章勋章勋章勋章+4
帖子
759
回复
8,421
积分
7,464
注册
2011-06-08
[怀旧国机]

精华 详解手机RMS系统

[复制链接]
查看 1,763 回复 8
楼主 发表于 | 只看该作者
36 人收藏

RMS(Record Management System)是MIDP中一个非常重要的子系统,因为它是J2ME应用程序进行持久性存储的唯一途径。当然你的系统如果支持JSR75的话,那么你可以使用FileConnection来对文件进行操作。在这个包里面总共包括四个接口、一个类和五个异常。由此可见RMS设计的非常小巧,这正是为了满足移动信息设备资源受限的需求。

  

  五个问题

  1,什么是持久性存储

  

  持久性存储简单的理解就是数据不因为程序的退出而丢失,一般我们在程序中声明的变量都是存储在stack或者heap上的,程序退出后这些数据会被清除以释放资源。而存储在RMS中的数据是不会被清除的。

  

  2,RMS中按照Record来存储的,ID是不是等于索引

  

  ID和索引的区别还是很大的,ID从1开始计数,这和数组的0开始计数有一些不同。ID可以是不连续的,当一个ID标记的Record被删除后那么对应的ID也就变得无效了。ID是不能重复使用的。

  

  3,RMS对存储数据格式没有具体的要求 

  只要数据可以被转换成byte[]那么这个数据就可以存储在RMS中,取出的时候仍然是byte[]。因此这就要求我们开发人员来描绘数据的样子,因为RMS只是负责把数据按照byte[]写入和读出。

  

  4,一个MIDlet套件中的RecordStore可以被另外一个RecordStore

  

  在MIDP1.0中不可以,在MIDP2.0中推出了共享机制,通过共享可以实现

  

  5,命名规则

  

  长度不超过32位的*字符,大小写敏感且在MIDlet套件里面是唯一的。

  

  具体使用使用

  1, 首先应该清楚RecordStore就相当于一个数据库,你必须新建一个这样的数据库才可以开始使用RMS进行存储读取数据。新建RecordStore非常简单,可以使用下面的静态方法static RecordStore openRecordStore(String recordStoreName, boolean *IfNecessary)

  注意,后面的boolean类型

的*IfNecessary表示,如果标记为true的时候,那么RecordStore不存在就创建它。关闭RecordStore使用closeRecordStore()。在RMS中另外一个重要的概念就是Record,这就像数据库中一行一行的数据一样。下面我们首先对RecordStore中的方法进行区分,有些是用来获得RecordStore信息的有些则是用来获得Record信息的。

  

  (1),获得RecordStore信息

  int getVersion()

  int getSize()

  String getName()

  long getLastModified()

  

  (2),获得Record信息

  int getNumRecords()

  int getNextRecordID()

  int getRecordSize(int recordId)

  

  2,对Record进行添加、修改、读取和删除。

  

  (1),读取记录

  byte[]

getRecord(int recordId)

  int getRecord(int recordId, byte[] buffer, int offset)

  

  (2),添加记录

  int addRecord(byte[] data, int offset, int numBytes)

  

  (3),更新记录

  setRecord(int recordId, byte[] newData, int offset, int numBytes)

  

  (4),删除记录

  *Record(int recordId)

  

  3, 前面我们提到了ID和Index是不同的,因为ID可能不连续,那么我们如何来遍历数据呢?很多人可能会想到使用for循环,但是由于id可能不连续,那么这个结果是无法预测的。程序很可能会失败。正是由于这样的原因,在RMS中提供了一个重要的接口RecordEnumeration。它可以遍历RecordStore中的数据。我们看看下面的方法。

  

  Re

cordEnumeration enumerateRecords(RecordFilter filter, RecordComparator comparator, boolean keep*d)

  

  在这个方法中还包括了RMS中的另外两个接口RecordFilter和RecordComparator,他们是用来量身定制遍历的结果集的,你可以实现RecordFilter来决定要把什么样的数据筛选出来,通过实现RecordComparator来决定数据的排序。最后的参数keep*d,如果设置为true的话,那么它会跟踪RecordStore中的数据变化,并且会反映到我们列出的结果集中,要知道这是非常好费资源的操作,建议设置为false。RecordEnumeration相当于一个双向的数据链表。你可以通过调用nextRecordId()和previousRecordId()来不停的移动。

  

  4, 创建可以被共享的RecordStore

  我们可以通过下面的方法来实现,必须要把authmode设置为AUTHMODE_ANY。

  static RecordStore openRecordStore(String recordStoreName, boolean *IfNecessary, int authmode, boolean writable)

  

  

  访问RecordStore

  如果另外一个MIDlet Suite中的MIDlet想访问的话,那么它需要知道要访问的MIDlet suite的vendorName和suiteName,一般我们可以从jad文件中得到这两个数据。我么使用如下的方法,

  static RecordStore openRecordStore(String recordStoreName, String vendorName, String suiteName)

  

  设计rms存储库(对底层方法的封装)

  其实,midp已经提供了基本的操作,我们完全可以不做任何事情也照样可以实现我们的存储要求,但是,在实际开发中要是我们每遇到不同的存储数据都要我们通过流的形式来write和read的话,确实很

不方便,也就是复用性太差了。所以在实际的开发中可能需要根据实际情况来封装一下底层的接口。

  

  刚才已经说过,rms对数据格式是没有要求的,前提是你把所有的数据转化为byte[]就OK了,所以所有问题的就落实到了如何将实际数据序列化成byte[]和反byte[]为实际数据上面来了。

  

  提示:

  

  1, 我们在存储数据的时候就是把数据按照我们预先定义好的格式存放到一张表里面。

  

  2, 表由很多个字段组成。

  

  3, 字段由名称和属性(类型)组成。

登录回复
9058
Lv6胸怀六国志等级图标等级图标等级图标等级图标等级图标
勋章
帖子
13
回复
1,229
积分
1.2万
注册
2011-02-06
1 楼

楼主辛苦了,请多发帖,多活跃。

9058
Lv6胸怀六国志等级图标等级图标等级图标等级图标等级图标
勋章
帖子
13
回复
1,229
积分
1.2万
注册
2011-02-06
2 楼

沙发是属于我的,别抢!

42313
Lv9有为九子能等级图标
勋章勋章勋章
帖子
105
回复
4,906
积分
2万
注册
2011-05-19
3 楼

支持你!

49233
Lv8能识八方语等级图标等级图标等级图标
勋章勋章勋章勋章
帖子
15
回复
2,080
积分
9.3万
注册
2011-06-07
4 楼

这帖不错,该顶!

91095
Lv5甘首五朝臣等级图标等级图标等级图标等级图标等级图标
勋章
帖子
3
回复
1,266
积分
2.1万
注册
2012-01-10
5 楼

沙发热?

4596
Lv1韶华一笑间等级图标
帖子
86
回复
1,982
积分
216
注册
2010-12-23
6 楼

好帖,要顶!

118020
Lv1韶华一笑间等级图标
帖子
0
回复
14
积分
156
注册
2012-08-03
7 楼

看帖回帖是美德!

106437
Lv1韶华一笑间等级图标
帖子
0
回复
81
积分
647
注册
2012-05-05
8 楼

你牛,我顶!

登录后可以回复这个帖子。旧账号可使用原密码登录。

登录 注册新号
← 返回版块