我正在开发一个显示公交车站时间表的小型 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 发生时,计数变量将通过两种方法设置为 1(如果 RMS 为空) - getNumRecords 和 numRecords。System.out.println 将产生 NextID: 0!这是不可接受的,因为记录 ID 不能为 0!有人可以解释这种奇怪的行为吗?
对不起,我的英语不好。