在最近更新的Android开发指南中,内容提供商的文档包含标题为Contract Classes的部分。虽然有一个指向联系人示例的链接,但目前还不清楚什么是合同类,以及如何为我的自定义内容提供商创建一个
希望得到一些帮助。
谢谢!
答案 0 :(得分:19)
什么是合同类?
合约类是public
final
类,其中包含有关ContentProvider
的URI,列名,MIME类型和其他元数据的常量定义。它还可以包含static
辅助方法来操作URI。
为何使用?
如何使用?
以下是为包含两个表的天气应用程序设计的示例Contract类代码段:weather table和location table。跳过注释和一些方法以保持小。一般来说,应该有很好的评论。
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);
}
.
.
.
}
}
答案 1 :(得分:15)
契约类定义了有助于应用程序使用的常量 内容URI,列名,意图操作和其他功能 内容提供商。合同类不会自动包含在内 与提供者;提供者的开发者必须定义它们然后 让它们可供其他开发者使用。
您可以创建自己的Contract类并在那里定义一些常量。例如,以后可以在代码中调用的列名称,这些代码可以对数据库进行查询等。
如何使用Contract类的好例子请参见此帖子Android - How do I load a contact Photo?
答案 2 :(得分:3)
Contract
是用于定义URI表和列的名称的常量的容器。它还在同一个包中的所有其他类中提供相同的常量。
答案 3 :(得分:0)
合同类是一个简单的类,其中包含要在SQL Lite DB中创建的表的常量。我们可以根据所需表的数量添加内部类。将合同类设置为 final ,以使表的常量无法更改。
合同类充当表类的容器,无需任何进一步的修改
表类(内部类)可能实现也可能不实现 BaseColumns 。
希望这可以清楚地了解合同等级!! :-)