| Flex 2 開発ガイド > データアクセスと相互接続性 > アプリケーションでのデータの分散 > 分散データアプリケーションの作成 | |||
Flex クライアントアプリケーションはクライアントサイドの DataService コンポーネントを使用して、サーバーサイドの Data Management Service との間でデータの送受信を行います。データは、プロトコル固有のメッセージチャネルを経由して Data Management Service 宛先との間で受け渡されます。DataService コンポーネントでは、クライアントサイドの ArrayCollection オブジェクトにデータを設定できます。また、他のクライアント上およびサーバー上にあるデータとの間で、ArrayCollection オブジェクトのデータの同期を管理できます。DataService コンポーネントは MXML または ActionScript で作成できます。
DataService コンポーネントでは有効な Data Management Service 宛先が必要になります。宛先は、services-config.xml 設定ファイル、または services-config.xml 設定ファイルを参照によってインクルードしているファイルで、設定します。Data Management Service 宛先の詳細については、Data Management Service の設定を参照してください。
DataService コンポーネントは、サーバーサイドの Data Management Service 宛先とのやり取りを管理します。DataService コンポーネントは MXML または ActionScript で作成できます。
次の例は、DataService コンポーネントを作成するための MXML コードです。DataService コンポーネントの宛先プロパティでは、サーバーサイドの有効な Data Management Service 宛先を参照する必要があります。
<?xml version="1.0"?>
<!-- fds\datamanagement\DataServiceMXML.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:DataService id="ds" destination="contact"/>
</mx:Application>
次の例は、同じ DataService コンポーネントを作成するための ActionScript コードです。
<?xml version="1.0"?>
<!-- fds\datamanagement\DataServiceAS.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();">
<mx:Script>
<![CDATA[
import mx.data.DataService;
public var ds:DataService;
public function initApp():void {
ds = new DataService("contact");
}
]]>
</mx:Script>
</mx:Application>
DataService コンポーネントを ActionScript で作成する場合は、mx.data.DataService クラスを読み込み、DataService 型の変数を宣言する必要があります。この変数の値を、新しい DataService オブジェクトに設定します。
DataService コンポーネントの fill() メソッドを呼び出すときは、Data Management Service 宛先からのデータを ArrayCollection オブジェクトに設定します。ArrayCollection オブジェクトは MXML または ActionScript で作成できます。ArrayCollection API では、データセットを操作するための一連のメソッドとプロパティが提供されています。詳細については、データプロバイダおよびコレクションの使用を参照してください。
設定した ArrayCollection オブジェクトを解放するには、DataService コンポーネントの releaseCollection() メソッドを呼び出します。同じ ArrayCollection オブジェクトに対して同じパラメータで再度 fill() メソッドを呼び出した場合は、データの最新のコピーが取得されます。別のパラメータで再度 fill() メソッドを呼び出した場合には、最初の設定が解放された後、新しい設定が取得されます。
fill() メソッドの第 1 パラメータは、設定する ArrayCollection の id 値です。その他のパラメータの値は、呼び出すサーバーサイド宛先の種類によって異なります。
たとえば、Java アダプタとカスタムアセンブラを使用する宛先を呼び出す場合は、ArrayCollection の id 以降の引数として、宛先で宣言されている、対応するサーバーサイドメソッドの引数を指定できます。Hibernate オブジェクトリレーショナルマッピングシステムを使用する宛先の場合には、ArrayCollection の id 以降の引数は Hibernate 固有の値になります。これらの引数は、宛先で使用するように設定されている Hibernate の機能によって異なります。次の例は、HQL (Hibernate Query Language) を使用する Hibernate 宛先を呼び出すための fill() メソッドです。
myService.fill(myCollection, "flex:hql", ["from Person p where p.firstName = :firstName", parameterMap]);
詳細については、『Data Management Service の設定』を参照してください。
次の例は、ArrayCollection オブジェクトの作成と設定を MXML で行うコードです。Application コンポーネントの creationComplete イベントリスナーを DataService コンポーネントの fill() メソッドに設定しているので、ArrayCollection である contacts はアプリケーションのロード時に設定されます。
<?xml version="1.0"?>
<!-- fds\datamanagement\FillArrayCollectionMXML.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="ds.fill(contacts);">
<mx:DataService id="ds" destination="contact"/>
<mx:ArrayCollection id="contacts"/>
</mx:Application>
次の例は、ArrayCollection の作成と設定を ActionScript で行うコードです。DataService コンポーネントの fill() メソッドを initApp() メソッドの中で呼び出しています。このメソッドは Application コンポーネントの creationComplete イベントリスナーとして指定しています。
<?xml version="1.0"?>
<!-- fds\datamanagement\FillArrayCollectionAS.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();">
<mx:Script>
<![CDATA[
import mx.data.DataService;
import mx.collections.ArrayCollection;
public var ds:DataService;
[Bindable]
public var contacts:ArrayCollection;
public function initApp():void {
contacts = new ArrayCollection();
ds = new DataService("contact");
ds.fill(contacts);
}
]]>
</mx:Script>
</mx:Application>
データプロバイダコントロールに分散データを設定するには、データバインディングを使用し、管理された ArrayCollection オブジェクトを、データプロバイダコントロールの dataProvider プロパティにバインドします。関連付けられた DataService コンポーネントの autoCommit プロパティを true に設定すると、DataGrid でのデータの変更が自動的に Data Management Service 宛先に送信されます。
次の例は、DataGrid コントロールの dataProvider プロパティにバインドされた ArrayCollection オブジェクトです。
<?xml version="1.0"?>
<!-- fds\datamanagement\PopulateDataGrid.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="ds.fill(contacts);">
<mx:DataService id="ds" destination="contact"/>
<mx:ArrayCollection id="contacts"/>
<mx:DataGrid id="dg" dataProvider="{contacts}" editable="true">
<mx:columns>
<mx:DataGridColumn dataField="contactId" headerText="Id"
editable="false"/>
<mx:DataGridColumn dataField="firstName" headerText="First Name"/>
<mx:DataGridColumn dataField="lastName" headerText="Last Name"/>
</mx:columns>
</mx:DataGrid>
</mx:Application>
デフォルトでは、DataService コンポーネントによって管理されている ArrayCollection オブジェクトのデータが変更されると、DataService コンポーネントの commit() メソッドが自動的に呼び出されます。または、commit() メソッドを手動で呼び出し、DataService コンポーネントの autoCommit プロパティを false に設定して、commit() メソッドへの手動呼び出しだけを許可することもできます。
次の例は、DataService コンポーネントによって管理されている ArrayCollection オブジェクト内のアイテムに対する手動更新処理です。
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();">
<mx:Script>
<![CDATA[
import mx.data.DataService;
import mx.collections.ArrayCollection;
import samples.customer.Customer;
...
public function initApp():void {
var customers:ArrayCollection = new ArrayCollection();
var customerService:DataService = new
DataService("customers");
customerService.autoCommit = false;
var customer:Customer = customers.getItemAt(4);
customer.name = "CyberTech Enterprises";
customerService.commit();
}
...
]]>
</mx:Script>
</mx:Application>
DataService コンポーネントによって、customer.name プロパティへの変更が含まれている単一の更新メッセージが作成されます。DataService コンポーネントの commit() メソッドが呼び出されると、このメッセージが宛先に送信されます。
次の例は、DataService コンポーネントによって管理されている ArrayCollection オブジェクト内のアイテムに対する、2 つの手動更新処理です。
... var customer:Customer = customers.getItemAt(4); var oldName:String = customer.name; customer.name = "CyberTech Enterprises"; customer.name = oldName; customerService.commit(); ...
DataService コンポーネントによって、互いの処理をキャンセルする 2 つの更新のログ記録が試みられます。customer.name プロパティの値が "CyberTech Enterprises" に変更されると、DataService コンポーネントによって単一の更新メッセージが作成されます。その後、customer.name = oldName を使用して古い名前に戻すと、顧客の名前に対応する元の更新メッセージが削除されます。その結果、commit() メソッドが呼び出されても何も送信されません。
次の例では、DataService コンポーネントによって管理されている ArrayCollection オブジェクトに対して顧客を追加または削除します。
<?xml version="1.0"?>
<!-- fds\datamanagement\AddRemoveItem.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.data.DataService;
import samples.customer.Customer;
public function initApp():void {
var customers:ArrayCollection = new ArrayCollection();
var customerService:DataService =
new DataService("customers");
customerService.autoCommit = false;
customers.addItemAt(new Customer(), 4);
// Remove the previously added customer.
customers.removeItemAt(4);
customerService.commit();
}
]]>
</mx:Script>
</mx:Application>
DataService コンポーネントによって、互いの処理をキャンセルする 2 つの更新のログ記録が試みられます。addItemAt() メソッドが呼び出されると、DataService コンポーネントによって customers 宛先に対する作成メッセージが作成されます。その後、removeItemAt(4) を呼び出すと、以前の作成メッセージが削除され、commit() メソッドが呼び出されても何も送信されません。
|
メモ |
|
ArrayCollection オブジェクトの |
ここまでの例ではすべて、指定したアイテムの ID のみを DataService コンポーネントで使用し、新しい更新によって保留中の更新をキャンセルするかどうかを決めています。次の例もこの種の動作を示しています。
...
var customer:Customer = new Customer("1099");
customer.name = "CyberTech Enterprises";
// リスト内の位置 4 に、1099 という ID を持つ顧客オブジェクトが存在します。
customers.setItemAt(customer, 4);
customerService.commit();
...
この例では、新しい Customer オブジェクトが作成され、その name プロパティの値が変更されても、DataService コンポーネントからサーバーに変更が送信されません。
mx.data.DataService クラスには、個々のデータアイテムを操作するためのメソッドがいくつかあります。これらのメソッドについて次の表で説明します。
|
メソッド |
説明 |
|---|---|
|
ArrayCollection を操作せずに新しいデータアイテムを作成できます。たとえば、コールセンターアプリケーションで顧客がフォームに入力して単一のチケットアイテムを作成する場合などに、このメソッドが役立ちます。一方、コールセンターの従業員はすべてのチケットアイテムを確認する必要があるため、従業員用のアプリケーションでは ArrayCollection にデータアイテムを設定します。 |
|
アイテムの ID から単一のデータアイテムを取得できます。たとえば、注文と注文アイテムの関係などの、マスター詳細関係で、このメソッドが役立ちます。 DataGrid 内の注文アイテムの 1 つをクリックしたときに、別の宛先に戻り、そこからより多くのプロパティを含んだ詳細なアイテムを取得したい、という場合があります。こうすることで、注文のための最低限のデータを最初の ArrayCollection に設定し、詳細なアイテムは必要なときだけ個別に取得することが可能になります。 |
|
|
|
アイテムを管理から解放します。このメソッドは、完了した |
次の例は、DataGrid コントロールが変更されたときに特定のデータアイテムを取得するメソッドです。アイテムは ResultEvent.result イベントから取得します。宛先に送られる ID 値は companyId で、現在 DataGrid コントロール内で選択されているアイテムの companyId に設定されます。宛先ではアイテムの ID に基づいてアイテムを取得します。ID は設定ファイルの宛先定義の中で指定します。
<mx:Script>
<![CDATA[
...
private function companyChange() {
dsCompany.getItem({companyId: dg.selectedItem.companyId});
}
]]>
</mx:Script>
...
DataService コンポーネントは、サーバーサイド宛先から切断された状態で開始されます。初めて処理を実行するときに、DataService コンポーネントによって宛先への接続が試みられます。処理が成功した場合は、result イベントが DataService コンポーネントに送られます。処理が失敗した場合は、fault イベントが送られます。DataService.disconnect() メソッドを呼び出すと、接続中のクライアントで切断を強制できます。この場合、DataService コンポーネントには自身の管理されたデータが保持され、再接続時には DataService コンポーネントによって自動的に再サブスクライブが行われ、変更が再開されます。
また、DataService.release() メソッドを呼び出すと、DataService コンポーネントによって取得された、管理されたオブジェクトを、すべて解放することができます。
Data Management Service では、発着信するデータの変更が DataStore と呼ばれるオブジェクトに保持されています。このオブジェクトは複数の DataService コンポーネントで共有できます。デフォルトでは、2 つの DataService コンポーネントについて、両者の間に関連付けが存在する場合、または一方の DataService コンポーネントの dataStore プロパティが他方の DataService コンポーネントの DataStore オブジェクトを参照するように手動で設定している場合に、それら 2 つの DataService コンポーネントが同じ DataStore オブジェクトを共有します。
DataService コンポーネントの commit() メソッドを呼び出すと、DataStore オブジェクトを共有しているすべての DataService コンポーネントに対する変更も含めて、DataStore オブジェクトのすべての変更が確定します。同様に、ある DataService コンポーネントの autoCommit プロパティを変更すると、同じ DataStore オブジェクトを共有しているすべての DataService コンポーネントの値が変更されます。
DataService コンポーネントは、処理の実行中に発生したエラーに対して fault イベントを送出します。これには、サーバーへの接続時に発生したエラーの他、処理の実行に応答してアセンブラクラスから送られるエラーも含まれます。
詳細については、『Adobe Flex 2 リファレンスガイド』の mx.data.errors package を参照してください。
DataService コンポーネントは、最初の処理の実行時に自動的に ChannelSet に接続します。クライアントで commit() 要求の処理中にエラーが発生した場合は、commit 内の変更が、確定解除された変更に戻されます。この場合、DataService コンポーネントの revertChanges() メソッドをアイテム引数付きで呼び出してそれらの変更を復帰するか、または、引数を指定せずに revertChanges() メソッドを呼び出してすべての変更を復帰するかを選択できます。
デフォルトでは、Data Management Service は Flex クライアントとサーバープッシュ API からのデータ変更を検出し、それらの変更を他のクライアントに伝播します。特定の宛先についてこのデフォルトの動作を変更するには、宛先設定で auto-sync-enabled を false に設定します。
クライアントサイドで特定の ArrayCollection について自動同期動作を有効にするには、DataService コンポーネントの autoSyncEnabled プロパティを true に設定してから、コンポーネントの fill() メソッドを呼び出します。同様に、管理されたアイテムを個々の参照から取得するには、DataService コンポーネントの autoSyncEnabled プロパティを true に設定してから、コンポーネントの getItem() または createItem() メソッドを呼び出します。
autoSyncEnabled プロパティの値を変更しても、そのクライアント上にある既存の管理されたオブジェクトには影響はありません。影響を受けるのは、値を変更した後の fill()、getItem()、および createItem() メソッド呼び出しのみです。これにより、同じクライアントにある同じ宛先からの管理されたインスタンスについて、autoSyncEnabled プロパティが true に設定されたインスタンスと、autoSyncEnabled プロパティが false に設定されたインスタンスを持つことができます。
デフォルトでは、クライアントで変更が検出されると、それらの変更が直ちに Data Management Service に適用されます。ある宛先についてこの動作を無効にするには、DataService コンポーネントの autoMerge プロパティを false に設定します。保留中の変更が着信すると、DataStore オブジェクトで mergeRequired プロパティが true に設定されます。保留中の変更を結合するには、DataService.dataStore.merge() メソッドを呼び出します。競合を避けるため、クライアントでデータをローカルに変更する場合は、その前に変更を結合してください。
|
メモ |
|
DataService コンポーネントの |
DataService コンポーネントの setCredentials() メソッドを使用すると、サーバーサイドのセキュリティ制限で必要になる承認情報を提供できます。これらの資格情報は logout() メソッドによって削除されます。承認情報の提供の詳細については、宛先のセキュリティ保護を参照してください。
Flex 2.01