Странное поведение RecordStore при возникновении исключения RecordStoreFullException
Я разрабатываю небольшое приложение 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! Это не приемлемо, потому что идентификатор записи не может быть 0! Может ли кто-нибудь объяснить это странное поведение?
Извините за мой плохой английский.
1 ответ
Уверены ли вы setRecord
бросает RecordStoreFullException
?
Если addRecord
бросает RecordStoreFullException
затем id
никогда не обновляется, и вы пытаетесь deleteRecord(0)
, который мог бы объяснить InvalidRecordIDException
,
Код Enumeration мне кажется, что он демонстрирует реальную ошибку в реализации RMS как Sun, так и Nokia (что может быть тем же, так как Series40 долгое время использовал KVM). Вы можете определить его (если он все еще там), посмотрев исходный код реализации Sun по адресу https://phoneme.dev.java.net/
Я бы посоветовал попробовать то же самое на телефоне Series60, поскольку он будет содержать реализацию RMS, разработанную Symbian.