我有一个从
检索到的有512条记录的RMSrs.getNumRecords();
但是当我尝试使用getRecordId(i)
或甚至使用
rs.enumerateRecords( null, null, false );
我得到InvalidRecordIDException
,从1到180的记录,我能够读取从181索引到关键字的记录。
我没有删除申请表中的任何记录。
在处理(读取此RMS)和覆盖应用程序时,已存在退出应用程序的实例。
我在读取记录时,在我的try块结束时关闭了RMS。
是否有任何可能的原因导致RMS损坏或特定索引损坏?
使用getRecord读取RMS的代码是
try {
RecordStore rs = RecordStore.openRecordStore(getTableName(), true);
ByteArrayInputStream inputStream = null;
DataInputStream inputDataStream = null;
int nor = rs.getNumRecords();
for(int i=1;i<=nor;i++)
{
System.out.println("i : "+i);
_recordByteArr = rs.getRecord(i);
inputStream = new ByteArrayInputStream(_recordByteArr);
inputDataStream = new DataInputStream(inputStream);
System.out.println("val at " + i + " ::" + new String(_recordByteArr));
//used inputDataStream.readUTF() here
}
if (inputDataStream != null) {
inputDataStream.close();
}
if (inputStream != null) {
inputStream.close();
}
rs.closeRecordStore();
} catch (Exception e) {
System.out.println("exp in read fieldtxn :" + e);
}
答案 0 :(得分:2)
根据enumerateRecords
方法的文档“这是遍历记录存储中所有记录的最有效方法。”
我总是使用rs.enumerateRecords(null /*filter*/, null /*comparator*/, false /*keepUpdated*/)
因为我认为它更安全。
从InvalidRecordIDException
遍历中获得RecordEnumeration
是非常奇怪的。一定要像这样使用它
RecordEnumeration re = rs.enumerateRecords( null, null, false );
while (re.hasNextElement()) {
int i = re.nextRecordId();
System.out.println("i : "+i);
_recordByteArr = rs.getRecord(i);
// ...
}
答案 1 :(得分:1)
当您在RMS中存储记录时,它会自动为每个记录获取商店创建一个新ID。此ID对于每条记录都是唯一的。假设您已添加10条记录。现在,如果您删除第5条记录并将新记录添加到RMS,则此新添加的记录将获得ID = 11。
当您使用getRecords(int recNumber)方法获取记录时,当recNumber值为5时,它会在删除第5条记录时将异常返回为InvalidRecordIDException
。
我创建了一个RMS Library class。有一个名为getRecords()的方法,它将返回String Array作为记录。您可以使用该String数组来获取您要查找的记录。对你来说很容易。