2

我有一个 RMS 检索自 512 条记录

rs.getNumRecords();

但是当我尝试使用getRecordId(i)或即使使用 读取记录时

rs.enumerateRecords( null, null, false );

我得到InvalidRecordIDException, 对于从 1 到 180 的记录,并且我能够读取从 181 索引到 onwords 的记录。

我不会删除应用程序中任何地方的记录。

在处理(读取此 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);
    }
4

2 回答 2

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);
    // ...
}
于 2012-08-07T12:12:24.503 回答
1

当您在 RMS 中存储记录时,它会自动为每个获取存储的记录创建一个新 ID。此 ID 对于每条记录都是唯一的。假设您添加了 10 条记录。现在,如果您删除第 5 条记录并向 RMS 添加一条新记录,那么这条新添加的记录将获得 ID = 11。

当您使用 getRecords(int recNumber) 方法获取记录时,当 recNumber 值为 5 时,它将返回异常,InvalidRecordIDException因为第 5 条记录被删除。

我创建了一个RMS 库类。有一个名为 getRecords() 的方法将返回字符串数组作为记录。您可以使用该字符串数组来获取您正在寻找的记录。这对你来说很容易。

于 2012-08-07T09:06:19.330 回答