1

我正在开发一个显示公交车站时间表的小型 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!有人可以解释这种奇怪的行为吗?

对不起,我的英语不好。

4

1 回答 1

0

你确定setRecordRecordStoreFullException吗?

如果addRecordthrows RecordStoreFullExceptionthenid永远不会更新并且您正在尝试更新deleteRecord(0),这可以解释InvalidRecordIDException.

枚举代​​码在我看来就像它展示了 Sun 和诺基亚的 RMS 实现中的一个真正的错误(这可能是相同的事情,因为 Series40 使用 KVM 很长一段时间)。您可以通过查看位于https://phoneme.dev.java.net/的 Sun 实现的源代码来查明它(假设它仍然存在)

我建议在 Series60 手机上尝试相同的操作,因为它包含 Symbian 开发的 RMS 实现。

于 2010-03-17T12:25:52.833 回答