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号仓库就不存在了,再删就会提示出错。。