最近更新されたAndroid開発ガイド)で、コンテンツプロバイダーのドキュメントには 契約クラス というタイトルのセクションが含まれています。連絡先の例へのリンクがありますが、契約クラスとは何か、およびカスタムコンテンツプロバイダー用にどのように作成するかをすぐに明確にする
これについていくつかの助けをいただければ幸いです。
ありがとう!
コントラクトクラスは、アプリケーションがコンテンツURI、列名、インテントアクション、およびコンテンツプロバイダーの他の機能を操作するのに役立つ定数を定義します。契約クラスはプロバイダーに自動的には含まれません。プロバイダーの開発者はそれらを定義し、他の開発者が利用できるようにする必要があります。
独自の契約クラスを作成し、そこでいくつかの定数を定義できます。たとえば、データベースへのクエリを行うコードで後で呼び出すことができる列名など。
コントラクトクラスの使用方法の良い例は、このスレッドを参照してください Android-連絡先の写真を読み込むにはどうすればよいですか?
Contractクラスとは
コントラクトクラスはpublic
final
クラスであり、URI、列名、MIMEタイプ、およびContentProvider
に関するその他のメタデータの定数定義が含まれています。また、URIを操作するためのstatic
ヘルパーメソッドを含めることもできます。
なぜ使用されるのですか?
使用方法
以下は、天気表と場所テーブルの2つのテーブルを含む天気アプリ用に設計されたサンプルの契約クラススニペットです。コメントといくつかのメソッドは、それを小さく保つためにスキップされます。一般的にそれはよくコメントされるべきです。
public class WeatherContract {
public static final String CONTENT_AUTHORITY =
"com.example.Android.sunshine.app";
public static final Uri BASE_CONTENT_URI =
Uri.parse("content://" + CONTENT_AUTHORITY);
public static final String PATH_WEATHER = "weather";
public static final String PATH_LOCATION = "location";
/**Inner class that defines the table contents of the location table. */
public static final class LocationEntry implements BaseColumns {
public static final String TABLE_NAME = "location";
public static final String COLUMN_LOCATION_SETTING = "location_setting";
public static final String COLUMN_CITY_NAME = "city_name";
public static final String COLUMN_COORD_LAT = "coord_lat";
public static final String COLUMN_COORD_LONG = "coord_long";
public static final Uri CONTENT_URI =
BASE_CONTENT_URI.buildUpon().appendPath(PATH_LOCATION).build();
// Custom MIME types
public static final String CONTENT_TYPE =
ContentResolver.CURSOR_DIR_BASE_TYPE +
"/" + CONTENT_AUTHORITY + "/" + PATH_LOCATION;
public static final String CONTENT_ITEM_TYPE =
ContentResolver.CURSOR_ITEM_BASE_TYPE +
"/" + CONTENT_AUTHORITY + "/" + PATH_LOCATION;
// Helper method
public static Uri buildLocationUri(long id) {
return ContentUris.withAppendedId(CONTENT_URI, id);
}
}
/** Inner class that defines the table contents of the weather table. */
public static final class WeatherEntry implements BaseColumns {
public static final String TABLE_NAME = "weather";
public static final String COLUMN_LOC_KEY = "location_id";
public static final String COLUMN_DATE = "date";
public static final String COLUMN_WEATHER_ID = "weather_id";
public static final String COLUMN_SHORT_DESC = "short_desc";
public static final String COLUMN_MIN_TEMP = "min";
public static final String COLUMN_MAX_TEMP = "max";
public static final String COLUMN_HUMIDITY = "humidity";
public static final String COLUMN_PRESSURE = "pressure";
public static final String COLUMN_WIND_SPEED = "wind";
public static final String COLUMN_DEGREES = "degrees";
public static final Uri CONTENT_URI =
BASE_CONTENT_URI.buildUpon().appendPath(PATH_WEATHER).build();
public static final String CONTENT_TYPE =
ContentResolver.CURSOR_DIR_BASE_TYPE + "/" + CONTENT_AUTHORITY +
"/" + PATH_WEATHER;
public static final String CONTENT_ITEM_TYPE =
ContentResolver.CURSOR_ITEM_BASE_TYPE + "/" + CONTENT_AUTHORITY +
"/" + PATH_WEATHER;
// Helper method.
public static Uri buildWeatherUri(long id) {
return ContentUris.withAppendedId(CONTENT_URI, id);
}
.
.
.
}
}
Contract
は、URIのテーブルと列の名前を定義する定数のコンテナーです。また、同じパッケージ内の他のすべてのクラスに同じ定数を提供します。
コントラクトクラスは、SQL Lite DBで作成されるテーブルの定数を保持する単純なクラスです。必要なテーブルの数に基づいて内部クラスを追加できます。コントラクトクラスfinalを作成して、テーブルの定数を変更できないようにします。
コントラクトクラスコンテナーとして機能テーブルクラスの数。これ以上の変更は不要
テーブルクラス(内部クラス)はBaseColumnsを実装する場合と実装しない場合があります。
これが契約クラスの明確な画像を与えることを願っています!! :-)