日期:2014-05-20  浏览次数:20715 次

Javame的rms的一个小问题。。。
Java code
protected void startApp() throws MIDletStateChangeException {
        // TODO Auto-generated method stub
        RecordStore rs=null;
        try
        {
            rs=RecordStore.openRecordStore("数据集1", true);
            System.out.print("添加一条记录:中国信息大学"+"\n");
            String str1="中国信息大学";
            byte[] by1=str1.getBytes();
            rs.addRecord(by1, 0, by1.length);
            int i=rs.getNumRecords();
            System.out.println("当前记录条数:"+i);
            byte[] by2=rs.getRecord(1);
            String str2=new String(by2);
            System.out.println("当前第一条记录是:"+str2);
            System.out.println("正在执行删除操作...");
            rs.deleteRecord(1);
            i=rs.getNumRecords();
            System.out.println("当前记录条数:"+i);
            
            rs.closeRecordStore();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }

javax.microedition.rms.InvalidRecordIDException的错误。但是如果把第二个i=rs.getRecords();改成int j=rs.getRecords();就没问题了。这是为什么?

------解决方案--------------------
找到问题了。。。是 rs.getRecord(1); 这个,尽管记录没有变,但是 id=1 的那个被你删了。所以再start的时候,recordID=1的那个早都没有了,你删的时候就出问题了。。。。。。
------解决方案--------------------
嗯,改了就好。。。。
***********************************
int rId = 0; //俺加的。。。
try
{
rs=RecordStore.openRecordStore("数据集1", true);
System.out.print("添加一条记录:中国信息大学"+"\n");
String str1="中国信息大学";
byte[] by1=str1.getBytes();
rs.addRecord(by1, 0, by1.length);
int i=rs.getNumRecords();
System.out.println("当前记录条数:"+i);
rId = rs.getNextRecordID() -1;//俺加的。。。
System.out.println("RecordID:" + rId );//俺加的。。。
//改: byte[] by2=rs.getRecord(1);
byte[] by2=rs.getRecord(rId);//俺加的。。。
String str2=new String(by2);
System.out.println("当前第一条记录是:"+str2);
System.out.println("正在执行删除操作...");
//改:rs.deleteRecord(1);
rs.deleteRecord(rId);//俺加的。。。
i=rs.getNumRecords();
System.out.println("当前记录条数:"+i);

rs.closeRecordStore();
}catch(Exception ex){
ex.printStackTrace();
}
***********************************
看来id一旦被占了。。。。就像学号被占了,就算死了,这学号也被占了,要让它活就setRecord了,不过你的代码就要改更多的地方了。。。
------解决方案--------------------
getNumRecords 获取的是你一共存储过的记录仓库个数,而不是当前实际的仓库个数,你deleteRecord1号仓库后,1号仓库就不存在了,再删就会提示出错。。