J2ME InvalidRecordIDException 诺基亚 2700

Posted

技术标签:

【中文标题】J2ME InvalidRecordIDException 诺基亚 2700【英文标题】:J2ME InvalidRecordIDException Nokia 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);
    

【问题讨论】:

【参考方案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 请你帮我解决这个问题? ***.com/questions/24342116/…【参考方案2】:

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

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

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

【讨论】:

感谢您的回复。但我不会通过我的应用程序删除任何记录。添加了记录,我只是在阅读这些记录。 是的,我在你的问题中读到了。我只是指出了这件事。

以上是关于J2ME InvalidRecordIDException 诺基亚 2700的主要内容,如果未能解决你的问题,请参考以下文章

j2me 闪屏

如何在 J2ME 中裁剪图像

无法在 J2ME 波兰语中使用相机拍摄图片?

从 j2me 调用 GWT 方法

如何使用j2me将数据保存在手机中?

再读J2ME游戏编程