快捷搜索:

RMS概念解析与使用指南

RMS(Record Management System)是MIDP中一个异常紧张的子系统,由于它是J2ME利用法度榜样进行持久性存储的独一道路。当然你的系统假如支持JSR75的话,那么你可以应用FileConnection来对文件进行操作,那越过了本文的评论争论范围。持久性存储在我们编写利用法度榜样的时刻常常要用到,比如记载游戏的排行榜、记任命户输入的用户名和密码等。本文将主要从RMS的基础观点和应用指南方面进行先容,目的在于给读者进行必然的指示。

RMS是首先在MIDP1.0中提出的,它所在的包是javax.microedition.rms,在这个包里面统共包括四个接口、一个类和五个非常。由此可见RMS设计的异常小巧,这恰是为了满意移动信息设备资本受限的需求。下面我们先弄清楚几个观点。

什么是持久性存储?

持久性存储简单的理解便是数据不由于法度榜样的退出而损掉,一样平常我们在法度榜样中声明的变量都是存储在stack或者heap上的,法度榜样退出后这些数据会被清除以开释资本。而存储在RMS中的数据是不会被清除的。

RMS的数据存储在哪里?

MIDP规范中没有规定RMS的数据必须存储在哪里,而是由厂商来详细实现。一样平常存储在非挥发性的内存空间。是以这是对法度榜样员透明的。

RMS的容量最小为若干?

MIDP中规定厂商实现RMS的时刻,供给的存储空间不能小于8KB,例如笔者的Nokia 6108的RMS空间为30KB。

RMS中按照Record来存储的,ID是不是即是索引?

ID和索引的差别照样很大年夜的,ID从1开始计数,这和数组的0开始计数有一些不合。ID可所以不继续的,当一个ID标记的Record被删除后那么对应的ID也就变得无效了。ID是不能重复应用的。

RMS对存储在此中的数据款式有详细要求吗?

谜底是没有,只要数据可以被转换成byte[]那么这个数据就可以存储在RMS中,掏出的时刻仍旧是byte[]。是以这就要求我们开拓职员来描画数据的样子,由于RMS只是认真把数据按照byte[]写入和读出。

在一个MIDlet套件中,RecordStore可以被共享吗?

可以

一个MIDlet套件中的RecordStore可以被别的一个RecordStore造访吗?

在MIDP1.0中弗成以,在MIDP2.0中推出了共享机制,经由过程共享可以实现。

上面以7个问题的形势总结了RMS中必要留意的基础观点,下面我们看看若何应用RMS。一样平常初学者进修RMS的时刻平日会被他们的措施给弄的不知若何下手,由于很多措施看上去很类似。这里我进行如下的总结,供给一些应用指南给大年夜家。

首先读者应该清楚RecordStore就相称于一个数据库,你必须新建一个这样的数据库才可以开始应用RMS进行存储读取数据。新建RecordStore异常简单,可以应用下面的静态措施。

static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary)

留意recordStoreName应该是长度不跨越32位的Unicode字符,大年夜小写敏感且在MIDlet套件里面是独一的,后面的boolean类型的createIfNecessary表示,假如标记为true的时刻,那么RecordStore不存在就创建它。关闭RecordStore应用closeRecordStore()。在RMS中别的一个紧张的观点便是Record,这就像数据库中一行一行的数据一样。下面我们首先对RecordStore中的措施进行区分,有些是用来得到RecordStore信息的有些则是用来得到Record信息的。

得到RecordStore信息

int getVersion()

int getSize()

String getName()

long getLastModified()

得到Record信息

int getNumRecords()

int getNextRecordID()

int getRecordSize(int recordId)

下面讲述若何对Record进行操作,主要包括添加、改动、读取和删除。

读取记录

byte[] getRecord(int recordId)

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

添加记录

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

更新记录

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

删除记录

deleteRecord(int recordId)

前面我们提到了ID和Index是不合的,由于ID可能不继续,那么我们若何来遍历数据呢?很多人可能会想到应用for轮回,然则因为id可能不继续,那么这个结果是无法猜测的。法度榜样很可能会掉败。恰是因为这样的缘故原由,在RMS中供给了一个紧张的接口RecordEnumeration。它可以遍历RecordStore中的数据。我们看看下面的措施。

RecordEnumeration enumerateRecords(RecordFilter filter, RecordComparator comparator, boolean keepUpdated)

在这个措施中还包括了RMS中的别的两个接口RecordFilter和RecordComparator,他们是用来量身定制遍历的结果集的,你可以实现RecordFilter来抉摘要把什么样的数据筛选出来,经由过程实现RecordComparator来抉择命据的排序。着末的参数keepUpdated,假如设置为true的话,那么它会跟踪RecordStore中的数据变更,并且会反应到我们列出的结果集中,要知道这是异常好费资本的操作,建议设置为false。RecordEnumeration相称于一个双向的数据链表。你可以经由过程调用nextRecordId()和previousRecordId()来不绝的移动。关于RecordEnumeration的其他措施读者可以参考java doc进行进修。

着末一点必要阐明的便是共享机制,这是在MIDP2.0中供给的新特点。容许一个套件中的RecordStore被别的一个造访,当然这是要在授权的模式下。首先我们看看道理图

假如MIDlet suite1在创建RecordStore1的时刻,授权模式为AUTHMODE_ANY的话,那么其他的套件就有可能造访到RecordStore1,比如上图中的MIDlet suite2。平日这样的造访经由过程两个步骤来完成。

创建可以被共享的RecordStore

我们可以经由过程下面的措施来实现,必须要把authmode设置为AUTHMODE_ANY。

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

造访RecordStore

假如别的一个MIDlet Suite中的MIDlet想造访的话,那么它必要知道要造访的MIDlet suite的vendorName和suiteName,一样平常我们可以从jad文件中获得这两个数据。我么应用如下的措施,

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

本文的主要目的是先容RMS的基础观点以及为读者供给若何应用RMS中的措施供给一些指示。想进一步钻研RMS,读者可以参考源码下载专区笔者供给的一个基于midp1.0实现的手机通信录。

您可能还会对下面的文章感兴趣: