J2Me работает со списком
Я пытаюсь "обернуть" класс javax.microedition.lcdui.List в класс MyList, я просто хочу использовать свои собственные методы добавления, редактирования, удаления (также getSelectedFlags, но из суперкласса).
Я также хочу управлять вещами recordStore, но я обнаружил, что индексация в List странная для меня, индекс всех элементов уменьшается, когда я удаляю первый элемент списка и т. Д. (Не уверен, что он на самом деле делает).
Я нашел решение, где я сохраняю вещи в вектор, который имеет поведение, аналогичное списку, но я не хочу сохранять вещи в векторе, а также в recordStore..
package hello;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;
public class ListOfPersons extends List {
RecordStore rs;
Hashtable hash;
public ListOfPersons(String title) {
super(title, List.IMPLICIT);
hash = new Hashtable();
this.loadAllRecords();
}
public void delete(int elementNum) {
Integer rsID = (Integer) hash.get(new Integer(elementNum));
openRS();
try {
rs.deleteRecord(rsID.intValue());
} catch (RecordStoreException ex) {
ex.printStackTrace();
}
closeRS();
hash.remove(new Integer(elementNum));
super.delete(elementNum);
}
public Person getSelectedPerson() {
throw new UnsupportedOperationException("Not yet implemented");
}
public int append(Person element) {
Integer idList, idRecord = null;
openRS();
idList = new Integer(super.append(element.toString(), null));
byte[] b;
try {
b = element.storeToBytes();
idRecord = new Integer(rs.addRecord(b, 0, b.length));
} catch (Exception ex) {
ex.printStackTrace();
} finally {
closeRS();
}
hash.put(idList, idRecord);
return idList.intValue();
}
private void loadAllRecords() {
Integer idList, idRecord;
Person p;
openRS();
try {
RecordEnumeration re = rs.enumerateRecords(null, null, true);
while (re.hasNextElement()) {
p = new Person();
idRecord = new Integer(re.nextRecordId());
byte[] b = rs.getRecord(idRecord.intValue());
p.loadFromBytes(b);
idList = new Integer(super.append(p.toString(), null));
hash.put(idList, idRecord);
}
} catch (RecordStoreException ex) {
ex.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
closeRS();
}
}
private void openRS() {
try {
rs = RecordStore.openRecordStore("Users", true);
} catch (RecordStoreException ex) {
ex.printStackTrace();
}
}
private void closeRS() {
try {
rs.closeRecordStore();
} catch (RecordStoreNotOpenException ex) {
ex.printStackTrace();
} catch (RecordStoreException ex) {
ex.printStackTrace();
}
}
}
1 ответ
Идентификаторы записи - это уникальные идентификаторы, которые добавляются вместе со вставленными данными системой управления правами. Идентификатор записи равен 1 для первой записи и увеличивается на единицу при каждом добавлении новой записи. Если какая-либо запись будет удалена из хранилища записей, идентификаторы записей не будут сброшены в последовательном порядке. Эта удаленная запись и ее идентификатор будут потеряны навсегда. Мы не можем повторно использовать идентификатор удаленной записи. То есть, если у нас есть три строки в таблице с идентификаторами 1, 2 и 3, удаление идентификатора 2 навсегда удалит этот идентификатор из хранилища записей. И записи с идентификаторами 1,3 останутся в хранилище записей. Если бы мы добавьте еще одну строку в эту таблицу, она будет иметь идентификатор 4. Так что, когда вы удаляете запись с идентификатором 1, первая не удаленная запись 'ID будет 2.
Я обычно открываю хранилище записей, читаю его данные и записываю их в вектор, затем удаляю, вставляю... записи в вектор (вместо хранилища записей) и, наконец, записываю оставшиеся записи в (даже новый) хранилище записей.
Рекомендации:
http://www.ibm.com/developerworks/library/j-j2me3/
http://www.j2mesalsa.com/elearning/rms.html