我正在尝试将javax.microedition.lcdui.List类“包装”到MyList类中,我只想使用自己的追加,编辑,删除方法(也来自超类的getSelectedFlags)。
我也想管理recordStore的东西,但是我发现List中的索引对我来说很奇怪,当我删除列表的第一个元素等时,所有元素的索引都会减少(不确定它到底在做什么)。
我找到了解决方案,其中我将东西保存到vector中,它具有与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();
}
}
}
答案 0 :(得分:4)
记录ID是与RMS系统插入的数据一起添加的唯一标识符。第一条记录的记录ID为1,每增加一条新记录,记录ID增加1。如果从记录存储中删除任何记录,记录ID将不会按顺序重置。此删除的记录及其ID将永久丢失。我们无法重复使用已删除的记录ID。也就是说,如果我们在ID为1,2和3的表中有三行,则删除ID 2将永久地从记录存储中删除此标识符。ID为1,3的记录将保留在recordstore中。如果我们是在此表中添加另一行,它的标识符为4.因此,当您删除ID为1的记录时,第一个未删除的记录'ID将为2.
我经常打开记录库,读取它的数据并将它们写入一个向量然后删除,插入,...记录在向量(而不是记录库)中,最后将剩余的记录写入(甚至是新的)记录库。
参考文献:
http://www.ibm.com/developerworks/library/j-j2me3/
http://www.j2mesalsa.com/elearning/rms.html