2012-02-11 101 views
22

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

希望对此有所帮助。

谢谢!

+0

另请参阅http://stackoverflow.com/questions/17451931/how-to-use-a-contract-class-in-android – OneWorld 2016-07-21 09:13:23

回答

12

合同类定义帮助应用程序与 内容的URI,列名,意图的行动,以及 其他功能内容提供商合作的常数。合同类别不会自动包含在供应商 中;供应商的开发人员必须定义它们,然后 使其可供其他开发人员使用。

您可以制作自己的Contract类并在其中定义一些常量。例如,列名,你可以在代码中,使得数据库查询后调用等

很好的例子怎样合同类用于看到这个线程Android - How do I load a contact Photo?

3

Contract是定义名称URI的常量容器表和列。它还在同一个包中的所有其他类中提供相同的常量。

12

什么是合同类?

合同类是包含了URI的常量定义,列名,MIME类型和其他元数据有关ContentProvider一个publicfinal类。它也可以包含static辅助方法来操作URI。

为什么使用?

  1. 合同等级在内容 内容提供商和其他应用程序之间建立合同。它可以确保您的 内容提供商可以正确访问即使有变化 到URI的实际值,列名等
  2. 由于它提供了助记名字的常量,开发商 不太可能使用不正确值列名或URI。
  3. 对于 想要使用您的内容提供者的客户端,可以很容易地使Javadoc文档可用。

它是如何使用的?

下面是一个示例合同类代码片段,它为包含两个表格的天气应用程序设计:天气表和位置表。跳过评论和一些方法来保持它很小。一般来说,它应该很好地评论。

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); 
     } 

     . 
     . 
     . 
    } 
} 
相关问题