J2ME InvalidRecordIDException诺基亚2700

时间:2012-08-07 06:56:37

标签: exception java-me rms

我有一个从

检索到的有512条记录的RMS
rs.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);
    }

2 个答案:

答案 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数组来获取您要查找的记录。对你来说很容易。