WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章J2ME技术进阶教程RMS从入门到精通之三

RMS从入门到精通之三
作者:不详  来源:J2MEDV  发布时间:2005-9-7 13:11:02
前面两篇文章详细的介绍了Record Management System的基本概念以及对象序列化的问题,现在我们主要介绍关于RecordStore类的使用,在SUN的网站提供了一个RMSAnalyzer类,你可以把他用在你的项目中来调试你的程序。

Record Store Discovery
你可以通过调用RecordStore.listRecordStores()来得到MIDlet suites中的Record Store,这个静态方法返回一个String类型的数组,每个代表Record Store的名字,如果没有record Store那么会返回null,方法RMSAnalyzer.annlyzeAll()通过调用listRecordStores()得到Record Store然后通过方法analyze()分析每个Record Store.

public void analyzeAll(){

String[] names = RecordStore.listRecordStores();

for( int i = 0;

names != null && i < names.length;

++i ){

analyze( names[i] );

}

}

注意到列出的数组名字是所属MIDlet suite的Record Store。MIDP中没有提供列举出任何其他MIDlet suites的Record Store的方法,在MIDP 1.0中Record Store在所属MIDlet suites外是不可见的,在MIDP 2.0中,MIDlet suite可以指定一个Record Store作为可共享的,但是其他的suite要知道他的名字才可以访问它。

Opening and closing Record Store
RecordStore.openRecordStore()是用来打开一个Record Store的,它也可以用来创建一个Record Store,这个静态方法返回一个Record Store的对象,下面是RMSAnalyzer.analyze()。

public void analyze( String rsName ){

RecordStore rs = null;

try {

rs = RecordStore.openRecordStore( rsName, false );

analyze( rs ); // call overloaded method

} catch( RecordStoreException e ){

logger.exception( rsName, e );

} finally {

try {

rs.closeRecordStore();

} catch( RecordStoreException e ){

// Ignore this exception

}

}

}

openRecordStore()的第二个参数表示如果record store不存在是不是创建新的,在MIDP2.0中,如果你想打开一个在其他的MIDlet suite里面创建的Record Store的话应该用下面的方法。

...

String name = "mySharedRS";

String vendor = "EricGiguere.com";

String suite = "TestSuite";

RecordStore rs =

RecordStore.openRecordStore( name, vendor, suite );

...

vendor和suite的名字应该和MIDlet suite的manifest和jad的内容一致。

当你完成了对record store的操作以后应该调用RecordStore.closeRecordStore()来关闭它,一个RecordStore的实例在一个MIDlet suite里面是唯一的,如果以同样的名字再次调用openRecordStore()的话会返回同样的实例,这样多个MIDlet在共享一个record store,每个record store会跟踪它被打开的次数,这个record store直到被调用相同次数的closeRecordStore()后才会彻底的关闭,对一个已经关闭的Record Store进行操作会导致抛出

RecordStoreNotOpenException。

Creating Record Store
创建一个私有的record store,把第二个参数设置为true调用openRecordStore(),...

// Create a record store

RecordStore rs = null;

try {

rs = RecordStore.openRecordStore( "myrs", true );

} catch( RecordStoreException e ){

// couldn't open it or create it

}

如果要创建一个可共享的record store,那么使用四个参数变量的openRecordStore()

int authMode = RecordStore.AUTHMODE_ANY;

boolean writable = true;

rs = RecordStore.openRecordStore( "myrs", true,

authMode, writable );

当第二个参数是true并且record store不存在的时候,后面两个参数控制他的授权模式和可写性,授权模式决定是否其他的MIDlet suite具有访问record store的权限,两种可能的模式是RecordStore.AUTHMODE_PRIVATE(只有拥有的SUITE才可以访问)和RecordStore.AUTHMODE_ANY(任何suite都可以访问),可写性控制着是否其他的suite能够修改record store,如果false的话,那么只有所属suite才可以修改,其他的只能读取。注意所属suite可以在任何时候调用RecordStore.setMode()来修改它的授权和读写模式,例如:

rs.setMode( RecordStore.AUTHMODE_ANY, false );事实上最好是创建一个record store,授权模式为RecordStore.AUTHMODE_PRIVATE。

Adding and updating records
记录就是字节数组,你可以通过调用RecordStore.addRecord()来添加一个新的记录到一个打开的Record Store

byte[] data = new byte[]{ 0, 1, 2, 3 };

int recordID;
recordID = rs.addRecord( data, 0, data.length );

如果第一个参数是null的话,那么你就能添加一个空记录。第二个和第三个参数说明了字节数组的起点和从起点开始的总的字节数。如果添加成功会返回新记录的record ID,如果失败会抛出异常,例如RecordStoreFullException。

通过调用RecordStore.setRecord()可以在任何时候更新记录的内容。

int recordID = ...; // some record ID

byte[] data = new byte[]{ 0, 10, 20, 30 };

rs.setRecord( recordID, data, 1, 2 );

// replaces all data in record with 10, 20

你不能大块的添加记录,必须首先把记录转换成数组,然后调用添加的函数,通过调用RecordStore.getNextRecordID()你可以得到下次调用addRecord()将要得到的record ID,这个值比现在使用的任何值都大。

Reading records
想要读取记录,有两种方法。第一是分配合适大小的数组然后把记录的内容复制过去。

int recordID = .... // some record ID

byte[] data = rs.getRecord( recordID );

第二种方法是把数组复制到预先分配的字节数组中,指定复制的起点并返回复制的字节数目。

int recordID = ...; // some record ID

byte[] data = ...; // an array

int offset = ...; // the starting offset

int numCopied = rs.getRecord( recordID, data, offset );

数组的大小必须能足够容纳数据,否则会抛出java.lang.ArrayIndexOutOfBoundsException.使用RecordStore.getRecordSize()来分配数组空间是合适的方法。事实上第一个方法等价与

byte[] data =

[1] [2] [3]  下一页

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码