站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题详解RMS(一)

详解RMS(一)

摘要: 详解RMS(一)
作者:


前面一篇文章中,我们大概了解了RMS。这篇文章将带领大家深入的学习RMS。

一、关于记录存储的名字带来的问题

我们知道记录存储就像一个数据库一样,而且每一个记录存储中的表都是以一个独一无二的名字,作为标识的。其大小不能超过32个Unicode 字元,且大小写有差別。因此同一个jar包之中的MIDlet都可以共享共享这些记录存储。而不同的jar包之间的MIDlet不可以共享。

这样当我们要打开一个记录存储时较安全的做法是先检查记录存储名称的大小。
public RecordStore openRSAnyway(String rsname)
{
RecordStore rs = null ;
//名稱大於32 個字元就不接受
if(rsname.length() > 32)
return null ;
try
{
rs = RecordStore.openRecordStore(rsname,true) ;
return rs ;
}catch(Exception e)
{
return null ;
}
}
对于之打开已经存在的记录存储的时候,我们可以使用下面的代码:
public RecordStore openRSExisted(String rsname)
{
RecordStore rs = null ;
//名稱大於32 個字元就不接受
if(rsname.length() > 32)
return null ;
try
{
rs = RecordStore.openRecordStore(rsname,false) ;
return rs ;
}catch(Exception e)
{
return null ;
}
}
相应的当要删除一个记录存储时我们也可以这样来写:
public boolean deleteRS(String rsname)
{
if(rsname.length() > 32)
return false ;
try
{
RecordStore.deleteRecordStore(rsname) ;
}catch(Exception e)
{
return false ;
}
return true ;
}

二、关于不同类型纪录的存储和读取

因为记录存储仅提供写入byte输组,因此当我们写入一般非byte类型的数据时就比较麻烦,我必须写一些方法来做额外的处理:

例如:把整数化成byte数组存入记录存储
public int writeInt2RS(RecordStore rs,int data)
{
byte []tmp = new byte[4] ;
tmp[0] = (byte)(0xff&( data >> 24)) ;
tmp[1] = (byte)(0xff&( data >> 16)) ;
tmp[2] = (byte)(0xff&( data >> 8)) ;
tmp[3] = (byte)(0xff&( data >> 0)) ;
try
{
return rs.addRecord(tmp,0,tmp.length) ;
}catch(Exception e)
{
}
return -1 ;
}
相反将byte数组取出之后转化为整数的方法:
public int readInt4RS(RecordStore rs,int recordid)
{
byte []tmp = new byte[4] ;
try
{
tmp = rs.getRecord(recordid) ;
}catch(Exception e)
{
}
int result = tmp[0] ;
result = (result << 8) + tmp[1] ;
result = (result << 8) + tmp[2] ;
result = (result << 8) + tmp[3] ;
return result ;
}

但是这里有一个问题,因为计算机在内部存储数据的方式的问题,当我们输入负数和字节所能存储的无符号数的最大值时,如255。上面的代码就会出错。

所以我们可以使用java给我们提供的现成的类来实现:
public int writeInt2RS(RecordStore rs,int data)
{
byte[] recordData = Integer.toString(data).getBytes();

try {
return rs.addRecord(recordData, 0, recordData.length);
}
catch (Exception e) {
System.err.println("Failed writing hi scores!");
}
return -1;
}

public int readInt4RS(RecordStore rs,int recordid)
{
int len=10;//rs.getRecordSize(recordid);
byte [] recordData = new byte[len];

try
{
recordData= rs.getRecord(recordid);
}catch(Exception e)
{
}
int result = (Integer.parseInt(new String(recordData)));
return result;
}

由于java中的字符型为16bits,所以上面的程序必须经过修改才能处理文字的存储。
public int writeChar2RS(RecordStore rs,char data)
{
byte []tmp = new byte[2] ;
tmp[0] = (byte)(0xff&( data >> 8)) ;
tmp[1] = (byte)(0xff&( data >> 0)) ;
try
{
return rs.addRecord(tmp,0,tmp.length) ;
}catch(Exception e){
}
return -1 ;
}

public char readChar4RS(RecordStore rs,int recordid)
{
byte []tmp = new byte[2] ;
try
{
tmp = rs.getRecord(recordid) ;
}catch(Exception e)
{
}
char result = (char)tmp[0] ;
result = (char)((result << 8) + (char)tmp[1]) ;
return result ;
}

三、更多方法
另外,RMS还为我们提供了更多的方法:
getLastModified() ——取得上次修改时间。
getName() —— 取得记录存储的名称。
getNextRecordID() —— 下一条记录的ID。
getNumRecords()—— 取得记录存储之中的纪录的条数。
getSize() —— 取得目前记录存储所占得空间。
getSizeAvailable() —— 看看目前还剩下多少空间可以写入数据。
getVersion() —— 取得记录存储的版本号(每次修改记录存储的资料,版本号就会更新)。


参考:
王森《Java 手機程式設計入門》






↑返回目录
前一篇: 详解RMS(二)
后一篇: j2me 游戏中使用记录管理系统保存和读取最高纪录