我目前正在做一些J2ME开发。我遇到的问题是用户可以添加和删除记录存储中的元素,如果记录被删除,那么该记录将保留为空,其他记录不会向上移动。我正在尝试提出一个循环,它将检查记录中是否有任何内容(如果它已被删除),如果它有,那么我想将该记录的内容添加到列表中。 我的代码类似如下:
for (int i = 1; i <= rs.getNumRecords(); i++)
{
// Re-allocate if necessary
if (rs.getRecordSize(i) > recData.length)
recData = new byte[rs.getRecordSize(i)];
len = rs.getRecord(i, recData, 0);
st = new String(recData, 0, len);
System.out.println("Record #" + i + ": " + new String(recData, 0, len));
System.out.println("------------------------------");
if(st != null)
{
list.insert(i-1, st, null);
}
}
当它到达rs.getRecordSize(i)时,我总是得到一个“javax.microedition.rms.InvalidRecordIDException:错误查找记录”。我知道这是因为记录是空的,但我想不出办法解决这个问题。
非常感谢任何帮助。
提前致谢。
答案 0 :(得分:6)
您应该使用RecordEnumeration访问记录:
RecordEnumeration renum = rs.enumerateRecords(null, null, false);
while (renum.hasNextElement())
{
int index = renum.nextRecordId();
if (store.getRecordSize(index) == STORE_LEN)
{
}
}
你不能依赖recordId做任何有用的事情。使用其他技术重新分配已删除的记录。
答案 1 :(得分:1)
为了让您的记录真正删除,您必须关闭de RecordStore。操作RecordStore的正确方法是打开它,使用它最终关闭它。希望这对你有用
答案 2 :(得分:0)
您可以尝试使用以下方法:
/**
* checks if record i is a valid records
* @param i (recordId
* @return true/false
*/
public boolean isValidRecord(int id) {
try {
recordStore.getRecordSize(id);
return true;
} catch (RecordStoreNotOpenException e1) {
e1.printStackTrace();
return false;
} catch (InvalidRecordIDException e1) {
//e1.printStackTrace(); //this printStackTrace is hidden on purpose: the error is in fact used to find out if the record id is valid or not.
return false;
} catch (RecordStoreException e1) {
e1.printStackTrace();
return false;
}
}