2

j2me アプリケーションで rms の概念を使用しています。

最初のレコードが rms に正常に追加され、次にレコードの読み取りも正常に行われましたが、同時に別の 1 つのレコードを追加しようとすると、リストに追加されず、rms に正常に追加されましたが、その時点では更新されませんでした。

アプリケーションを一度終了してから、読み取りを記録するアプリケーションを実行すると、すべての記録が表示されます。リストを更新してすべてのレコードを取得する方法は?

これは、レコードを追加するための私のソースです:

public void AddCustomer(String str) throws RecordStoreNotOpenException
{       
    byte[] rec=str.getBytes();
    try
    {
        rs19 = RecordStore.openRecordStore(ADDREMOVE_CUSTOMER, true);
        rs19.addRecord(rec, 0, rec.length);
        System.out.println("REcord added successfully");
        v.addElement(str);
    }
    catch (Exception e)
    {
    }
}

これは読み取りレコードのソースです:

public ChoiceGroup getChoiceGroup10() {
    if (choiceGroup10 == null) {                                   
        choiceGroup10 = new ChoiceGroup("Select Customer", Choice.POPUP);                                     
        choiceGroup10.append("none", null);       
        try
        {
            rs19.openRecordStore(ADDREMOVE_CUSTOMER, true);
            String value="";
            String comma=",";
            Vector v1=new Vector();
            StringBuffer enumList=new StringBuffer();
            recEnum = rs19.enumerateRecords( null, null, false );
    while( recEnum.hasNextElement() )
            {
                byte[] data = recEnum.nextRecord();
                enumList.append(new String(data));
                enumList.append(",");
            }
            records=new String(enumList);
            int index=records.indexOf(comma);
            while(index>=0)
            {
                v1.addElement(records.substring(0,index));
                records = records.substring(index+comma.length());
                index = records.indexOf(comma);
            }
            v1.addElement( records );
            if( v1.size()>0 )
            {
                for(int i=0; i<v1.size(); i++)
                {
                    value= (String)v1.elementAt(i);
                    choiceGroup10.append(value, null);
                }
            }
        }
        catch(InvalidRecordIDException ie)
        {
            ie.printStackTrace();
        }
        catch(RecordStoreException re)
        {
            re.printStackTrace();
        }
        catch(NullPointerException ne)
        {
            System.out.println(ne);
        }
        finally
        {
            try {
                rs19.closeRecordStore();
            } catch (RecordStoreException ex) {
                ex.printStackTrace();
            }
        }

    }                          
    return choiceGroup10;
}
4

2 に答える 2

1
  recEnum = rs19.enumerateRecords( null, null, false ); // --> keepUpdated is false

あなたが説明したように、 rms に正常に追加されましたが、その時間が更新されなかったのは、に渡された 3 番目のパラメーターによって定義されているようenumerateRecordsです。

その理由を理解し、メソッド パラメーターの使用方法を学習するには、API ドキュメント (オンラインで入手可能keepUpdated) を参照してください -パラメーターの説明に注意してください。

public RecordEnumeration enumerateRecords(RecordFilter filter,
                                          RecordComparator comparator,
                                          boolean keepUpdated)
                                   throws RecordStoreNotOpenException

    Returns an enumeration for traversing a set of records in the record store
      in an optionally specified order...

    Parameters:
        filter - if non-null, will be used to determine what subset
          of the record store records will be used
        comparator - if non-null, will be used to determine the order
          in which the records are returned
        keepUpdated - if true, the enumerator will keep its enumeration
          current with any changes in the records of the record store.
          Use with caution as there are possible performance consequences.
          If false the enumeration will not be kept current and may return
          recordIds for records that have been deleted or miss records
          that are added later. It may also return records out of order
          that have been modified after the enumeration was built.
          Note that any changes to records in the record store are
          accurately reflected when the record is later retrieved,
          either directly or through the enumeration. The thing that is
          risked by setting this parameter false is the filtering and
          sorting order of the enumeration when records are modified,
          added, or deleted.
          ...

上記のように、MIDlet をkeepUpdatedパラメーターの別の値でテストすることを検討してください。

  recEnum = rs19.enumerateRecords(null, null, true); // --> test with 'true' here
于 2012-07-21T08:48:31.987 に答える
1

gnatは完全に正しいですが、誰も keepUpdated パラメータを使用しないのには十分な理由があります (MIPD 仕様の非常に悪い部分への依存、同期に対する制御の喪失など)。

アプリケーションの動作を制御したい場合は、keepUpdated を false のままにし、AddCustomer() メソッドで RecordStore を閉じる必要があります。

次に、AddCustomer() が正常に呼び出されたため、(getChoiceGroup10() メソッド全体を再実行し、新しい結果を画面に表示することによって) GUI の更新をトリガーするメカニズムが必要です。これを適切に行うには、GUI スレッド モデルを深く理解する必要があります。LWUIT を使用していますか? GUI のためだけにスレッドを作成しましたか? GUI は必要な場合にのみ更新されますか、それともフレーム レートがありますか?

その理解に基づいて、リスナー インターフェイスを使用するか、同期を使用するか、後で画面の一部を更新するフラグを設定します...

通常、画面に描画するスレッドが RecordStore からも読み取ることは望ましくないため、実際には getChoiceGroup10() メソッドを書き直してコンテンツを 2 つのスレッドに分割することになります。

于 2012-07-21T12:25:02.590 に答える