【问题标题】:J2ME InvalidRecordIDException Nokia 2700J2ME InvalidRecordIDException 诺基亚 2700
【发布时间】:2012-08-07 06:56:37
【问题描述】:

我有一个 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);
    }

【问题讨论】:

    标签: exception java-me rms


    【解决方案1】:

    根据enumerateRecords 方法的文档,“这是遍历记录存储中所有记录的最有效方法。”

    我总是使用rs.enumerateRecords(null /*filter*/, null /*comparator*/, false /*keepUpdated*/),因为我相信它更安全。

    很奇怪,您从 RecordEnumeration 遍历中得到了 InvalidRecordIDException。一定要这样使用

    RecordEnumeration re = rs.enumerateRecords( null, null, false );
    while (re.hasNextElement()) {
        int i = re.nextRecordId();
        System.out.println("i : "+i);
        _recordByteArr =  rs.getRecord(i);
        // ...
    }
    

    【讨论】:

    • 谢谢。使用此代码我没有收到 InvalidRecordIdException,但我仍然无法检索从 1 到 180 的记录。 Logs(system.out.println) 打印 i 从 512 到 181,对于 1 到 180,我打印为 0 i以上循环。由于循环迭代了 512 次,并且 id 从 512 打印到 181,其余记录为 0,那么 1 到 180 的记录是否存在问题??
    • 正如您所说“在处理(读取此 RMS)和覆盖应用程序之间存在退出应用程序的实例。”我相信您的 recordStore 文件可能已损坏。
    • @TelmoPimentelMota 请你帮我解决这个问题? stackoverflow.com/questions/24342116/…
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回复。但我不会通过我的应用程序删除任何记录。添加了记录,我只是在阅读这些记录。
    • 是的,我在你的问题中读到了。我只是指出了这件事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多