[セットトップ]android Content Provider詳細7-ContentProviderクラスの実装

5886 ワード

(android技術交流QQ群へようこそ:20979692)
ContentProviderクラスの実装
ContentProviderインスタンスは、ある構造型データセットに対する操作を管理し、別のアプリケーションからの要求を処理する.すべての操作は最終的にContentResolverを呼び出し、ContentProviderの特定のメソッドを呼び出します. 
検索方法
仮想クラスContentProviderは、派生クラスで実装する必要がある6つの仮想メソッドを定義します.これらのメソッドは、onCreate()以外に、content providerを操作したいクライアントアプリケーションに呼び出されます.
query() 
あなたのproviderからデータを取得します.パラメータを使用して、クエリーするテーブル、行と列、および結果を返すソート方法を指定します.Cursorオブジェクトを返します. 
insert() 
あなたのproviderに新しい行を挿入します.パラメータは、選択するテーブルと挿入するカラムの値を指定します.新しい行を指すcontent URIを返します. 
update() 
あなたのproviderに存在するローを更新します.パラメータには、選択するテーブルと更新するロー、および更新するカラムデータが指定されています.更新されたローの数を返します. 
delete() 
providerからローを削除します.パラメータは、テーブルと削除するローを選択するように指定します.削除したローの数を返します. 
getType() 
Content URIに対応するMIMEタイプを返します. 
onCreate() 
あなたのproviderを初期化します.Androidシステムは、providerを作成した後、すぐにこの方法を呼び出します.ContentResolverオブジェクトが操作されるまでProviderが作成されないことに注意してください. 
これらの方法を実現するには、以上のことを担当する必要があります.
・onCreate()以外のすべての方法は、マルチスレッドによって同時に呼び出されることができる.マルチスレッドで安全でなければなりません 
・onCreate()での時間のかかる操作を避ける.本当にやる必要があるときまで初期化作業を延期します. 
・これらの方法を実現しなければならないにもかかわらず、あなたの方法は所望のデータ型を返す以外に、すべてのことをする必要はありません.たとえば、他のアプリケーションがいくつかのテーブルにデータを挿入することを阻止したい場合は、insert()の呼び出しを無視して0を返すことができます. 
実装query()メソッド
ContentProvider.Query()メソッドは、Cursorオブジェクトを返すか、失敗した場合はExceptionを放出する必要があります.SQLiteデータベースを使用してデータを格納する場合は、SQLiteDatabaseクラスのquery()メソッドから返されるCursorオブジェクトを簡単に返すことができます.クエリにローがない場合は、Cursorのインスタンスを返す必要がありますが、getCount()メソッドは0を返します.クエリ中に内部エラーが発生した場合にのみnullを返す必要があります. 
SQLiteデータベースをデータとして保存しない場合は、Cursorの派生クラスを使用する必要があります.たとえばMatrixCursorクラスは、各ローがObjectの配列であるcursorを実現します.このクラスはaddRow()を使用して新しいローを追加します. 
Androidシステムは、Exceptionをプロセス間で転送できる必要があることを覚えておいてください.Androidは以下の異常を行うことができます.これらの例外は、クエリー・エラーの処理に役立つ場合があります.
・IllegalArgumentException(providerが不正なcontent URIを受け取ったら投げ出すことができます)
· NullPointerException 
インプリメンテーションinsert()メソッド
Insert()メソッドは、パラメータContentValueに格納される新しいローを適切なテーブルに追加します.カラムの名前がContentValueパラメータに適切でない場合は、providerのコードでもデータベース・テーブルでもデフォルト値を指定することができます. 
このメソッドは、新しいローのcontent URIを返します.このURIを構築するには、withAppendedId()を使用して、テーブルのcontent URIの後に新しい行の_を追加します.ID(または他のプライマリ・キー)の値でよい. 
delete()メソッドの実装
delete()メソッドでは、データストレージからローを物理的に削除する必要はありません.providerに同期アダプタを使用している場合は、行全体を削除するのではなく、削除する行に「delete」フラグを付けることを考慮する必要があります.同期アダプタは、削除するローを確認し、providerから削除する前にserverから削除します. 
update()メソッドの実装
update()メソッドにはinsert()と同じパラメータタイプContentValueとdelete()とContentProviderがあります.query()は同じselectionとselectionArgsパラメータです.これにより、これらの方法の間でコードを再利用することができます. 
実装onCreate()メソッド
Androidシステムはproviderを起動した後にonCreate()を呼び出します.この方法では、時間のかからない初期化タスクのみを実行し、providerがデータに対する要求を受信するまで、データベースの作成とデータのロードを延期する必要があります.onCreate()で時間のかかる作業をすると、providerの起動が遅くなります.従って、providerから他のアプリケーションへの反応速度も遅くなる. 
たとえば、SQLiteデータベースを使用している場合はContentProvider.onCreate()で新しいSQLiteOpenHelperオブジェクトを作成し、データベースを初めて開いたときにSQLのテーブルを作成します.そうするためにgetWritableDatabase()を初めて呼び出すとSQLiteOpenHelperが自動的に呼び出されます.onCreate()メソッド. 
次の2つのコードフラグメントはContentProvider.で実証されている.onCreate()とSQLiteOpenHelper.onCreate()間のインタラクション.第1段対ContentProvider.onCreate()の実装:
 
public class ExampleProvider extends ContentProvider

    /*
     * Defines a handle to the database helper object. The MainDatabaseHelper class is defined
     * in a following snippet.
     */
    private MainDatabaseHelper mOpenHelper;

    // Defines the database name
    private static final String DBNAME = "mydb";

    // Holds the database object
    private SQLiteDatabase db;

    public boolean onCreate() {

        /*
         * Creates a new helper object. This method always returns quickly.
         * Notice that the database itself isn't created or opened
         * until SQLiteOpenHelper.getWritableDatabase is called
         */
        mOpenHelper = new SQLiteOpenHelper(
            getContext(),        // the application context
            DBNAME,              // the name of the database)
            null,                // uses the default SQLite cursor
            1                    // the version number
        );

        return true;
    }

    ...

    // Implements the provider's insert method
    public Cursor insert(Uri uri, ContentValues values) {
        // Insert code here to determine which table to open, handle error-checking, and so forth

        ...

        /*
         * Gets a writeable database. This will trigger its creation if it doesn't already exist.
         *
         */
        db = mOpenHelper.getWritableDatabase();
    }
}

 
2番目のセグメントコードはSQLiteOpenHelperです.onCreate()の実装には、helperクラスが含まれています.
...
// A string that defines the SQL statement for creating a table
private static final String SQL_CREATE_MAIN = "CREATE TABLE " +
    "main " +                       // Table's name
    "(" +                           // The columns in the table
    " _ID INTEGER PRIMARY KEY, " +
    " WORD TEXT"
    " FREQUENCY INTEGER " +
    " LOCALE TEXT )";
...
/**
 * Helper class that actually creates and manages the provider's underlying data repository.
 */
protected static final class MainDatabaseHelper extends SQLiteOpenHelper {

    /*
     * Instantiates an open helper for the provider's SQLite data repository
     * Do not do database creation and upgrade here.
     */
    MainDatabaseHelper(Context context) {
        super(context, DBNAME, null, 1);
    }

    /*
     * Creates the data repository. This is called when the provider attempts to open the
     * repository and SQLite reports that it doesn't exist.
     */
    public void onCreate(SQLiteDatabase db) {

        // Creates the main table
        db.execSQL(SQL_CREATE_MAIN);
    }
}

 
android技術交流QQ群へようこそ:20979692