Я разрабатываю небольшое приложение 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!
Может ли кто-нибудь объяснить это странное поведение?
Извините за мой плохой английский.