【Creating a Content Provider】
要建立一个content provider,你必须:
1、建立一个系统来存储数据。大多数content providers存在他们的数据使用Android的文件存在方法或SQLite数据库,但你可以存储你的数据你希望的任何方法。Android提供 SQLiteOpenHelper类来帮助你建立一个数据库和SQLiteDatabase来管理它。
2、扩展ContentProvider类来提供数据的访问。
3、声明content provider在manifest文件为你的应用程序(AndroidManifest.xml)。
下面的部分有关后两样的注意事项。
【Extendig the Content Provider class】
你定义一个ContentProvider子类来暴露你你的数据给别人使用ContenResolver和Cursor期望的协议。原则上,这意味着实现6个虚方法声明在ContentProvider类中的:
query()方法必须返回一个Cursor 对象可以遍历你请求的数据。Cursor它本身是个接口,但Android提供一些准备好的Cursor对象你可以使用。例如,SQLiteCursor能可遍历数据存储在SQLite数据库。你获得一个Cursor对象通过调用任何SQLiteDatabase的query()方法。也有其它的Cursor实现 --例如MatrixCuror --对于数据不存在于数据库中的情况。
因为这些ContentProvider方法能各种ContentResolver对象调用在不同的进程和线程里,他们必须以线程安全的方式实现。
作为礼貌,你也可能希望调用ContentResolver.notifyChange()来通知收听者当有有数据修改时。
除了定义它的子类外,有其它的步骤你应该做来简单客户的工作并且让类更易访问:
1、定义一个公共的静态常量Uri命名为CONTENT_URI。这是代表全"content:URI"的字符串,你的provider操作的。你必须 定义一个独特的字符串为这个值。最好的解决方法是使用全称类名作为content provider(小写)。例如,TransportationProvider的URI类可以按如下定义:
如果provider有子表,也定义CONTENT_URI常量给每一个子表。这些URI应该有同样的权限,只能被他们的路径分辨。例如:
定义列名content provider将会返回给客户的。如果你在使用一个潜在的数据库,这些列名通常同一的SQL database列名。也定义公共的静态String常量,客户可以使用来查询指定的列。
…………(此处省略250字)
【Declaring the content provider】
为了让Android系统知道你开发的content provider,声明它用<provider>元素在manifest文件里。Content Providers没有在manifest文件里对Android系统不可见。
name局长覆盖了ContentProvider子类。authorities属性content:URI权限。例如如果ContentProvider子类是AutoInfoProvider,<provider>可以会像这样:
注意authorities属性遗漏了content:URI路径。例如,如果AutoInfoProvider控制子表为不同的auto或不同的制造者,
…………(此处省略250字)
【Content URI Summary】
…………(此处省略250字)