Странное поведение RecordStore при возникновении исключения RecordStoreFullException - PullRequest
1 голос
/ 17 марта 2010

Я разрабатываю небольшое приложение J2ME, которое отображает расписание автобусных остановок - они хранятся в виде записей в MIDP RecordStores.

Иногда записи могут не уместиться в одном RecordStore, особенно при обновлении записи - с помощью метода setRecord - возникает RecordStoreFullException. Я ловлю исключение и пытаюсь записать запись в новый RecordStore вместе с удалением предыдущей в старом RecordStore. Все работает нормально, кроме удаления записи из RecordStore, где происходит исключение RecordStoreFullException. Если я пытаюсь удалить запись, которая не может быть обновлена, выдается другое исключение типа InvalidRecordIDException. Это странно и недокументировано в javadoc MIDP. Я тестировал его на 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! Может ли кто-нибудь объяснить это странное поведение?

Извините за мой плохой английский.

1 Ответ

0 голосов
/ 17 марта 2010

Вы уверены, что setRecord бросает RecordStoreFullException?

Если addRecord выбрасывает RecordStoreFullException, то id никогда не обновляется, и вы пытаетесь deleteRecord(0), что может объяснить InvalidRecordIDException.

Мне кажется, что код перечисления демонстрирует реальную ошибку в реализации RMS как Sun, так и Nokia (что может быть тем же, поскольку Series40 долгое время использовала KVM). Вы можете определить его (если он все еще там), взглянув на исходный код реализации Sun по адресу https://phoneme.dev.java.net/

Я бы посоветовал попробовать то же самое на телефоне Series60, поскольку он будет содержать реализацию RMS, разработанную Symbian.

...