我正在开发一个小的J2ME应用程序,该应用程序显示公交车站的时间表-它们作为记录存储在MIDP RecordStores中。
有时记录不能容纳单个RecordStore,尤其是在记录更新时-使用setRecord方法-发生RecordStoreFullException。我捕获到异常,并尝试将记录写入新的RecordStore并删除旧的RecordStore中的前一个。
除了从发生RecordStoreFullException的RecordStore中删除记录以外,其他所有操作都正常。如果我尝试删除无法更新的记录,则会引发另一个InvalidRecordIDException类型的异常。这很奇怪,在MIDP javadoc中没有记录。我已经在Sun WTK 2.5.2,MicroEdition SDK 3.0和Nokia Series 40 SDK上进行了测试。此外,我创建了一个代码来再现这种奇怪的行为:
RecordStore rms = null;
int id = 0;
try {
rms = RecordStore.openRecordStore("Test", true);
byte[] raw = new byte[192*10024]; //Big enough to cause RecordStoreFullException
id = rms.addRecord(raw, 0, 160);
rms.setRecord(id, raw, 0, raw.length);
} catch (Exception e) {
try {
int count = rms.getNumRecords();
RecordEnumeration en = rms.enumerateRecords(null, null, true);
count = en.numRecords();
while(en.hasNextElement()){
System.out.println("NextID: "+en.nextRecordId());
}
rms.deleteRecord(id); //this won't work!
rms.setRecord(id, new byte[5], 0, 5); //this won't work too!
} catch (Exception ex) {
ex.printStackTrace();
}
}
我添加了额外的枚举代码,以产生其他奇怪的行为-发生RecordStoreFullException时,两种方法-getNumRecords和numRecords会将count变量设置为1(如果RMS为空)。 System.out.println将产生NextID:0!这是不可接受的,因为记录ID不能为0!
有人可以解释这种奇怪的行为吗?
对不起,我的英语不好。
最佳答案
您确定setRecord
抛出RecordStoreFullException
吗?
如果addRecord
抛出RecordStoreFullException
,则id
永远不会更新,而您正在尝试deleteRecord(0)
,这可能会解释InvalidRecordIDException
。
在我看来,枚举代码似乎演示了Sun和诺基亚在RMS实施中的真实错误(这可能是相同的,因为Series40长期使用KVM)。您可以通过在https://phoneme.dev.java.net/处查看Sun实现的源代码来查明它(假设它仍然存在)。
我建议您在Series60手机上尝试相同的操作,因为它将包含由Symbian开发的RMS实现。