データプロバイダおよびコレクションについて

多くのコントロールやコンテナがメニューなどのコントロールの表示、ユーザー操作、または構成のためにデータを必要とします。このデータを提供するには、データプロバイダおよびコレクションの概念と、コレクションのしくみを理解する必要があります。

サブトピック

データプロバイダについて
コレクションについて
MXML アプリケーションでのデータプロバイダの指定
例 : 簡単なデータプロバイダの使用

データプロバイダについて

リストコントロールなどの一部の Flex フレームワーク コンポーネントは、"データプロバイダ" からのデータを表します。データプロバイダとは、コントロールによって必要とされるデータを含むオブジェクトのことです。たとえば、Tree コントロールのデータプロバイダは、ツリー構造と各ツリーノードに割り当てられるデータを決定し、ComboBox コントロールのデータプロバイダは、コントロールのドロップダウンリストの項目を決定します。標準コントロールの中にも、ColorPicker や MenuBar のようにデータプロバイダからデータを取得するものが数多くあります。アプリケーションデータを表示するコントロールのことを、"データプロバイダコントロール" と呼ぶことがあります。

データプロバイダを使用するコンポーネントは次のとおりです。

最も単純なデータプロバイダとしては、ストリングまたはオブジェクトの配列が考えられます。たとえば、静的な ComboBox コントロールを定義するために次のコードを使用できます。

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Script>
    <![CDATA[
        [Bindable]
        public var myArray:Array = ["AL", "AK", "AR"]; 
    ]]>
  </mx:Script>
  <mx:ComboBox id="myCB0" dataProvider="{myArray}"/> 
</mx:Application>

ただし、Array や Object などの生データオブジェクトをデータプロバイダとして使用する場合は、次のような制限があります。

Flex は、データの同期を保証するとともに、より簡単で高度なデータアクセスおよび操作ツールを提供するため、"コレクション" メカニズムを備えています。また、コレクションを使用すると、異なるタイプのデータへのアクセスとその管理を一貫したインターフェイスを通じて行うことができます。コレクションの詳細については、コレクションについてを参照してください。

個々のコントロールの詳細については、『Adobe Flex 2 リファレンスガイド』のコントロールのページを参照してください。データプロバイダベースのコントロールを使用したプログラミングについては、データ駆動型コントロールの使用を参照してください。

データプロバイダの種類

Flex フレームワークでサポートされている基本的なデータプロバイダの種類は次の 2 つです。

リニアまたはリストデータプロバイダは、それぞれが同じ構造を持ついくつかのオブジェクトから構成されるフラットなデータです。これは通常、1 次元の配列か、またはそのような配列から派生したオブジェクト (ActionScript オブジェクトグラフなど) です。また、XMLListCollection オブジェクトをリニアデータプロバイダとして使用することもできます。

リストデータプロバイダはすべてのデータプロバイダコントロールで使用できますが、通常は Tree コントロールと大部分のメニューコントロールのインスタンスを除くデータプロバイダコントロールで使用します。データプロバイダの内容が動的に変更される場合は一般に、ArrayCollection クラスと IList または ICollectionView インターフェイスのメソッドとプロパティを使用して、これらのデータプロバイダの表現と操作を行います。

階層データプロバイダは、カスケード構造のデータ (非対称データの場合が多い) から成ります。データのソースには XML オブジェクトがよく使われますが、汎用 Object または具象クラスをソースとすることもできます。階層データプロバイダは通常、階層データを表示するために設計された次のような Flex コントロールで使用します。

また、階層データプロバイダからデータを抽出し、リニアデータを受け取る List や DataGrid などのコントロールで使用することもできます。

階層データプロバイダを使用すると、ツリーやカスケードメニューのレイアウトに合わせてデータ構造を定義できます。たとえば、ツリーには通常、ルートノードの下にブランチノードまたはリーフ子ノードがあります。ブランチノードの下には他の子ブランチノードまたはリーフノードがありますが、リーフノードはツリーの終点です。

Flex 階層データコントロールは、階層データプロバイダにアクセスして操作するために "データ記述子" インターフェイスを使用します。Flex フレームワークには、必要なインターフェイスを実装した DefaultDataDescriptor クラスが用意されています。データプロバイダが、デフォルトデータ記述子によって必要とされる構造に適合しない場合は、独自のデータ記述子クラスを作成して必要なインターフェイスを実装できます。

動的な階層データへのアクセスと操作には、ArrayCollection クラス、XMLListCollection クラス、ICollectionView インターフェイス、または IList インターフェイスを使用します。

階層データプロバイダの使用の詳細については、階層データプロバイダの使用を参照してください。

データプロバイダと uid プロパティ

Flex データ駆動型コントロール (List クラスのサブクラスであるすべてのコントロールなど) は、一意の識別子 (uid) を使用してデータプロバイダのアイテムを追跡します。Flex では、uid を自動的に作成し管理できます。ただし、IUID インターフェイスを実装して独自の uid プロパティを提供しなければならない場合や、独自の uid プロパティを提供することで処理効率が向上する場合があります。

メモ

 

Flex はオブジェクト (たとえば ArrayCollection のアイテムなど) の UID を作成するとき、アイテムの mx_internal_uid プロパティとして UID を追加します。mx_internal_uid プロパティは、バインド可能プロパティを持たない動的なオブジェクトに対して作成されます。mx_internal_uid プロパティが作成されないようにするには、オブジェクトクラスで、少なくとも 1 つのプロパティに [Bindable] メタデータタグを付けるか、IUID インターフェイスを実装するか、uid プロパティに値を設定します。

複数の異なるオブジェクトを同一と見なす必要がある場合は、IUID インターフェイスを実装して、複数のオブジェクトに同じ uid を割り当てられるようにする必要があります。IUID インターフェイスを実装しなければならない代表的な例は、アプリケーションでウィンドウページングコレクションを使用する場合です。ウィンドウページングコレクション内をカーソルが移動すると、サーバーからの特定のアイテムの取得とメモリからの解放が何度も行われます。アイテムがメモリに取り込まれるたびに、そのアイテムを表す新しいオブジェクトが作成されます。アイテムが等しいかどうかを比較する場合は、同じアイテムを表すすべてのオブジェクトが Flex によって同じものと見なされる必要があります。

IUID インターフェイスを実装しなければならないケースより、そうすることで処理効率が向上するケースの方がよくあります。原則として、データプロバイダエレメントが動的クラスのメンバーである場合、IUID インターフェイスは実装しません。これらのクラスについては uid プロパティを自動的に作成できます。しかしそれでも非効率的な面があるため、処理効率が特に重視される場合は、IUID インターフェイスの実装を検討してもかまいません。

その他のケースでは、Flex はディクショナリメカニズムを使用して uid を管理しますが、これは独自の UID を提供する場合ほど効率的ではありません。

Object クラスと Array クラスは動的なので、データプロバイダのアイテムがこれらのクラスに属する場合、通常はデータプロバイダに対して特別なことを行う必要はありません。ただし、データプロバイダのメンバーが独自に定義したカスタムクラスに属する場合は、IUID インターフェイスの実装を検討してください。

IUID インターフェイスには、クラスメンバーの一意の識別子を表す uid プロパティが 1 つ含まれているだけで、メソッドはありません。Flex には、疑似乱数生成器を使用して標準の GUID 形式に準拠した識別子を作成する UIDUtil クラスが用意されています。この識別子は、ユニバーサルに一意であることは保証されていませんが、作成したクラスの全メンバーの中では一意になります。UIDUtil クラスを使用するクラス、たとえば姓、名、id の各フィールドを持つ Person クラスを実装するには、次のパターンを使用できます。

package {
    import mx.core.IUID;
    import mx.utils.UIDUtil;

    [Bindable]
    public class Person implements IUID {
        public var id:String;
        public var firstName:String;
        public var lastName:String;
        private var _uid:String;

        public function Person() {
            _uid = createUID();
        }

        public function get uid():String {
            return _uid;
        }

        public function set uid(value:String):void {
            // コンストラクタによって uid が作成されるので、何もしない
        }
    }
}

オブジェクトに従業員 ID などの一意のフィールドが含まれている場合には、UIDUtil クラスを使用する必要はありません。uid プロパティの値はデータプロバイダの中だけでオブジェクトを一意に識別できればよいので、この場合は従業員 ID を uid プロパティとして使用できます。次の例ではこの方法を採っています。

package 
{
    import mx.core.IUID;

    [Bindable]
    public class Person implements IUID {
        public var employee_id:String;
        public var firstName:String;
        public var lastName:String; 

        public function get uid(): String {
            return employee_id;
        }

        public function set uid(value: String): void {
            employee_id=value;
        }
    }
} 

メモ

 

オブジェクトのクローン作成では UID は管理されず、UID と関連付けられることもありません。したがって、内部 UID を持つ対象のクローンを作成する場合、その内部 UID を変更する必要があります。UID は、ダイナミックオブジェクトの場合のみ、mx_internal_uid に格納されます。IUID を実装するデータクラスのインスタンスは UID を .uid プロパティに格納するので、クローンの作成後、このプロパティを変更する必要があります。

ただし、データプロバイダでは IUID を実装する必要はありません。データプロバイダが IUID を実装しないデータクラスのインスタンスでも、ダイナミックオブジェクトではない場合、クローン技術は適切に動作しますが、ほとんどのデータプロバイダアイテムは、特にそれらのオブジェクトのクローン作成が必須ではない場合には、IUID を実装する必要があります。


Flex 2.01