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的主要内容,如果未能解决你的问题,请参考以下文章