我正在开发一个显示公交车站时刻表的小型J2ME应用程序 - 它们作为记录存储在MIDP RecordStores中。
有时记录不能适合单个RecordStore,特别是在记录更新时 - 使用setRecord方法 - 发生RecordStoreFullException。我捕获异常,并尝试将记录写入新的RecordStore,同时删除旧RecordStore中的前一个记录。 一切正常,除了从RecordStore中删除RecordStoreFullException发生的记录。如果我尝试删除无法更新的记录,则抛出另一个类型为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发生时,count变量将被两种方法设置为1(如果RMS为空) - getNumRecords和numRecords。 System.out.println将生成NextID:0!这是不可接受的,因为记录ID不能为0! 有人可以解释这种奇怪的行为吗?
抱歉我的英语不好。
答案 0 :(得分:0)
您确定setRecord
会抛出RecordStoreFullException
吗?
如果addRecord
抛出RecordStoreFullException
,那么id
永远不会更新,而您正在尝试deleteRecord(0)
,这可以解释InvalidRecordIDException
。
在我看来,Enumeration代码似乎证明了Sun和诺基亚RMS实现中的一个真正的错误(自从Series40使用KVM很长一段时间以来,这可能是同样的事情)。您可以通过查看Sun在https://phoneme.dev.java.net/的实现的源代码来确定它(假设它仍在那里)
我建议在Series60手机上尝试相同,因为它将包含Symbian开发的RMS实现。