什么是合同类以及如何使用它

时间:2012-02-11 19:29:45

标签: android android-contentprovider

在最近更新的Android开发指南中,内容提供商的文档包含标题为Contract Classes的部分。虽然有一个指向联系人示例的链接,但目前还不清楚什么是合同类,以及如何为我的自定义内容提供商创建一个

希望得到一些帮助。

谢谢!

4 个答案:

答案 0 :(得分:19)

什么是合同类?

合约类是public final类,其中包含有关ContentProvider的URI,列名,MIME类型和其他元数据的常量定义。它还可以包含static辅助方法来操作URI。

为何使用?

  1. 合同类在内容之间建立合同 提供者和其他应用程序它确保你的 即使有更改,也可以正确访问内容提供程序 到URI,列名等的实际值。
  2. 由于它为其常量提供了助记符名称,因此开发人员可以使用 不太可能对列名或URI使用不正确的值。
  3. 很容易将Javadoc文档提供给客户端 想要使用您的内容提供商。
  4. 如何使用?

    以下是为包含两个表的天气应用程序设计的示例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

希望这可以清楚地了解合同等级!! :-)