Java™ Platform
Standard Edition 7
javax.sql.rowset.spi

インタフェース SyncResolver

アプリケーションは、getStatus メソッドおよび getConflictValue メソッドから取得された情報を使って、データソース内に保持すべき値を決定できます。続いて、SyncResolversetResolvedValue メソッドを呼び出して、RowSet オブジェクトおよびデータソースに保持する値を設定します。

     resolver.setResolvedValue("DEPT", 8390426);
 
上のコード例では、列名によって、指定の値を設定される RowSet オブジェクト内の列を指定しています。列番号で列を指定することもできます。

アプリケーションは現在の競合する行のすべての競合を解決したら、setResolvedValue メソッドを呼び出し、SyncResolver オブジェクトの競合する行ごとにこの手順を繰り返します。

SyncResolver オブジェクトのナビゲート

SyncResolver オブジェクトは RowSet オブジェクトであるため、アプリケーションはすべての RowSet メソッドを使用して、カーソルを動かし、SyncResolver オブジェクトをナビゲートできます。たとえば、アプリケーションは RowSetnext メソッドを使用して、各行に移動し、SyncResolvergetStatus メソッドを呼び出して、行に競合が含まれるかどうかを確認できます。競合を含む行では、アプリケーションは列で繰り返し処理を行い、null 以外の値を見つけることができます。この値は競合のあるデータソースの値になります。

SyncResolver オブジェクトのナビゲートを簡単にするには、特に大半の行に競合がない場合に、SyncResolver インタフェースで nextConflict メソッドおよび previousConflict メソッドを定義します。これらのメソッドは、少なくとも 1 つの競合値を含む行のみを移動します。続いてアプリケーションで列番号を指定して、SyncResolvergetConflictValue メソッドを呼び出し、競合値自体を取得します。次のセクションのコードの抜粋に例を示します。

コード例

次のコードの抜粋は、未接続の RowSet オブジェクト crs が自身を配下のデータソースと同期することで、競合を解決する方法を示しています。try ブロックで、crsacceptChanges メソッドを呼び出し、Connection オブジェクト con を渡しています。競合がない場合は、単に crs の変更がデータソースに書き込まれます。しかし、競合がある場合は、acceptChanges メソッドが SyncProviderException オブジェクトをスローし、catch ブロックが有効になります。この例では、SyncResolver オブジェクトを使用した多くの方法のうちの 1 つを説明しており、SyncResolvernextConflict メソッドを while ループで使用しています。nextConflictfalse を返す (SyncResolver オブジェクト resolver に競合する行がなくなる) とループが終了します。この特定のコードの抜粋では、resolver は競合を更新した行 (SyncResolver.UPDATE_ROW_CONFLICT のステータスの行) を検索し、このコードの抜粋の残りの部分は、crs が更新を試みたために競合が発生した行に対してのみ実行されます。

resolver のカーソルが更新競合のある次の競合する行に移動した後、getRow メソッドは現在の行を示し、CachedRowSet オブジェクト crs のカーソルは crs の比較可能な行に移動します。resolvercrs の両方の行の列で繰り返し処理を行うことによって、競合している値を取得し、比較して、保持する値を決定します。このコードの抜粋では、crs の値が解決済みの値として設定された値であり、これを使用して、データソースの競合する値が上書きされることを意味します。

     try {

         crs.acceptChanges(con);

     } catch (SyncProviderException spe) {

         SyncResolver resolver = spe.getSyncResolver();

         Object crsValue;  // value in the RowSet object
         Object resolverValue:  // value in the SyncResolver object
         Object resolvedValue:  // value to be persisted

         while(resolver.nextConflict())  {
             if(resolver.getStatus() == SyncResolver.UPDATE_ROW_CONFLICT)  {
                 int row = resolver.getRow();
                 crs.absolute(row);

                 int colCount = crs.getMetaData().getColumnCount();
                 for(int j = 1; j <= colCount; j++) {
                     if (resolver.getConflictValue(j) != null)  {
                         crsValue = crs.getObject(j);
                         resolverValue = resolver.getConflictValue(j);
                         . . .
                         // compare crsValue and resolverValue to determine
                         // which should be the resolved value (the value to persist)
                         resolvedValue = crsValue;

                         resolver.setResolvedValue(j, resolvedValue);
                      }
                  }
              }
          }
      }
 
Java™ Platform
Standard Edition 7

バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.