2

から取得した512レコードのRMSがあります

rs.getNumRecords();

しかし、私がレコードを使用しようとすると、getRecordId(i)または使用している場合でも

rs.enumerateRecords( null, null, false );

InvalidRecordIDException1から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);
    }
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 に答える