[セットトップ]Androidの4大コンポーネントのContent Provider


Androidアプリケーションは、ファイルまたはSqlLiteデータベースを使用してデータを格納できます.Content Providerは、連絡先情報が複数のアプリケーションによってアクセスできるなど、複数のアプリケーション間でデータを共有する方法を提供します.Content Providerは、他のアプリケーションがデータにアクセスするための標準的なメソッドのセットを提供するクラスを実現します.
アプリケーションはContent Providerで次の操作を実行できます.
  • クエリーデータ
  • 修正データ
  • 追加データ
  • 削除データ
  • 標準のContent Provider
    Androidは、連絡先情報、ピクチャライブラリなど、システムで実装されている標準Content Providerを提供しています.これらのContent Providerを使用して、デバイスに格納されている連絡先情報、ピクチャなどにアクセスできます.1.クエリーデータContent Providerで使用されるクエリー文字列は、標準のSQLクエリーとは異なります.select,add,delete,modifyなどの多くの操作は、3つの部分からなる特殊なURIを使用して行われる.
  • “content://”
  • は、データの経路
  • を表す.
  • オプションの識別データのID
  • 以下に、いくつかの例URIを示す.
    content://media/internal/imagesこのURIはデバイスに格納されているすべてのピクチャを返します.
    content://contacts/people/このURIはデバイス上のすべての連絡先情報を返します.
    content://contacts/people/45このURIは、単一の結果(ID 45の連絡先レコード)を返す
    Androidは一連のヘルプクラス(android.providerパッケージの下)を提供し、クラス変数の形式で与えられたクエリー文字列が多く含まれています.この方法は理解しやすいです.次の例を参照してください.
    MediaStore.Images.Media.INTERNAL_CONTENT_URI 
    Contacts.People.CONTENT_URI

    だから、上のようにcontent://contacts/people/45このURIは次のように書くことができます.
    Uri person = ContentUris.withAppendedId(People.CONTENT_URI, 45);
    データ照会を実行します.
    Cursor cur = managedQuery(person, null, null, null);
    このクエリは、すべてのデータフィールドを含むCursorを返します.Cursorを反復してすべてのデータを取得できます.
     public class ContentProviderDemo extends Activity {
     @Override
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    displayRecords(); 
    }
    private void displayRecords() { 
    //                
    String columns[] = new String[] { People.NAME, People.NUMBER }; 
    Uri mContacts = People.CONTENT_URI; 
    Cursor cur = managedQuery( 
    mContacts, columns, //          
    null, // WHERE   
    null, // WHERE       
    null // Order-by   
    ); 
    if (cur.moveToFirst()) { 
    String name = null; 
    String phoneNo = null; 
    do { 
    name = cur.getString(cur.getColumnIndex(People.NAME)); 
    phoneNo = cur.getString(cur.getColumnIndex(People.NUMBER)); 
    Toast.makeText(this, name + ” ” + phoneNo, Toast.LENGTH_LONG ).show(); 
    } while (cur.moveToNext()); 
    } 
    } 
    }

    2、記録の修正
    ContentResolverを使用できます.update()メソッドを使用してデータを変更します.
    updateRecord(10, ”XYZ”);
    第10条レコードのnameフィールド値を「XYZ」に変更
    private void updateRecord(int recNo, String name) { 
    Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, recNo); 
    ContentValues values = new ContentValues(); 
    values.put(People.NAME, name); 
    getContentResolver().update(uri, values, null, null); 
    }

    3、記録の追加
    ContentResolverを呼び出すことができます.Insert()メソッドは、追加するレコードのターゲットURIと、新しいレコード値を含むMapオブジェクトを受け取り、呼び出し後の戻り値は、新しいレコードのURIであり、レコード番号を含むレコードを追加します.
    private void insertRecords(String name, String phoneNo) { 
    ContentValues values = new ContentValues(); 
    values.put(People.NAME, name); 
    Uri uri = getContentResolver().insert(People.CONTENT_URI, values); 
    Log.d(”ANDROID”, uri.toString()); 
    Uri numberUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY); 
    values.clear(); 
    values.put(Contacts.Phones.TYPE, People.Phones.TYPE_MOBILE); 
    values.put(People.NUMBER, phoneNo); 
    getContentResolver().insert(numberUri, values); 
    }

    これにより、insertRecords(name,phoneNo)を呼び出して、連絡先情報帳に連絡先名と電話番号を追加することができます.
    4、レコードの削除
    getContextResolver.delete()メソッドは、レコードを削除するために使用できます.デバイス上のすべての連絡先情報を削除するには、次の手順に従います.
    private void deleteRecords() { 
    Uri uri = People.CONTENT_URI; 
    getContentResolver().delete(uri, null, null); 
    }

    WHERE条件文を指定して特定のレコードを削除し、nameが「XYZ」のレコードを削除します.
    getContentResolver().delete(uri, “NAME=” + “„XYZ‟”, null);

    Content Providerの作成:
    独自のContent Providerを作成するには、次の手順に従います.
    1.ContentProviderから継承されたクラスを作成する
    2、public static final Uriタイプのクラス変数を定義するには、クラスのフルネームであることが望ましい一意の文字列値を指定する必要があります.
    public static final Uri CONTENT_URI = Uri.parse(“content://com.mycom.MyContentProvider”);
    、データストレージシステムを作成する.ほとんどのContent Providerでは、AndroidファイルシステムまたはSQLiteデータベースを使用してデータを保持していますが、任意の方法で保存することもできます.
    4.クライアントに返されるデータ列名を定義します.Androidデータベースを使用している場合は、データ列の使用方法は、以前よく知られていた他のデータベースと同じです.しかし、定義する必要があります.id列は、各レコードの一意性を表すために使用されます.
    5、ビットマップファイルなどのバイト型データを格納する場合、そのデータを格納するデータ列は、実際に保存したファイルを表すURI文字列であり、クライアントはそれによって対応するファイルデータを読み出し、このようなデータ型を処理するContent Providerは_dataのフィールド,Dataフィールドには、Androidファイルシステム上のファイルの正確なパスがリストされます.このフィールドはクライアントだけでなくContentResolverでも使用できます.クライアントはContentResolverを呼び出すことができる.OpenOutputStream()メソッドは、このURIが指すファイルリソースを処理します.ContentResolver自体であれば、クライアントよりも権限が高いため、データファイルに直接アクセスできます.
    6.public static String型の変数を宣言し、Cursorから返すデータ列を指定します.
    7.クエリーは、Cursorタイプのオブジェクトを返します.insert()、update()、delete()などの書き込み操作を実行するすべての方法が傍受されます.ContentResover()を使用することができます.notifyChange()メソッドは、リスナーにデータ更新に関する情報を通知する.
    8、AndroidManifest.xmlにContent Providerと表示されます.
    9、処理するデータ型が比較的新しいタイプである場合は、ContentProviderのために新しいMIMEタイプを定義する必要があります.geType(url)が戻ります.