ContentProvider的架构
Authority类似web中的域名,每个contentprovider会通过AndroidManifest.xml向系统注册authority,如下。其中name是类名,即如何找寻这个contentprovider。可以省去AndroidManifest.xml中packagename,不需要写完整的类名。如android:name=".BookProvider"。
<providerandroid:name="SomeProvider" android:authorities="com.your-company.SomeProvider"/>
<providerandroid:name="NotePadProvider"android:authorities="com.google.provider.NotePad"/>
和web的URL域名类似,content provider进行数据访问的URL为content://authority/......,例如content://com.your-company.SomeProvider/。对于Android自己提供的contentprovider,有时会写的比较简单,例如用contacts来代替com.google.android.contacts,如content://contacts/……。
有时注册的provider会比较复杂,例如Android的联系人信息,其uri为content://com.android.contacts/contacts,其源代码信息为如下,该provider需要读写权限。
<providerandroid:name="ContactsProvider2"
android:authorities="contacts;com.android.contacts"
android:label="@string/provider_label"
android:multiprocess="false"
android:readPermission="android.permission.READ_CONTACTS"
android:writePermission="android.permission.WRITE_CONTACTS">
<path-permission
android:pathPrefix="/search_suggest_query"
android:readPermission="android.permission.GLOBAL_SEARCH"/>
<path-permission
android:pathPrefix="/search_suggest_shortcut"
android:readPermission="android.permission.GLOBAL_SEARCH"/>
<path-permission
android:pathPattern="/contacts/.*/photo"
android:readPermission="android.permission.GLOBAL_SEARCH"/>
<grant-uri-permissionandroid:pathPattern=".*"/>
</provider>
ContentURI的结构。Android通过ContentURI来获取数据,并返回具有行列结构的游标cursor。content UI的格式为:
content://<authority-name>/<path-segment1>/<path-segment2>/etc…
例子:content://com.google.provider.NotePad/notes/23
例子的/notes表示collection,或理解为一个目录,称为pathsegment,而/23表示特定的item,是具体的index,contentprovider提供的是二维数据,这就是该row的_id值。
MIMEType。HTTP响应会带有MIMEType,最长江就是text/html,告知body的数据类型。ContentProvider也一样,可以用方法获得MIME。MIME由两部分组成:type/subtype,具体可以参考rfc2046。type和subtype的定义可以在IANA中查到。下面是MIME的几个例子:
text/xml
application/rtf
application/vnd.ms-excel //vnd是vendeor-specific,厂家自定义格式,如此处的微软excel格式
application/x-tar //x-表示自定义的私有格式
在ContentProvider中可以存在多层目录,即存在item和collection,相应地分别有item的MIMEtye和collection的MIMEtype。Android采用namespace的方式定义type和subtype。如下:
vnd.android.cursor.item/vnd.<yourcompanyname.contenttype>是item的MIME type
vnd.android.cursor.dir/vnd.<yourcompanyname.contenttype>是collection的MIMEtype
从上面的格式可以看到,type已指定,开发者只能对subtype进行设置。
定义清晰描述。我们应该为所创建的contentprovider提供清晰的定义或描述,可通过所使用的Uri进行constant的预定义。例如MediaStore.Images.Media.INTERNETAL_CONTENT_URI表示content://media/internal/images。同时我们也应为个列
小例子:读取联系人信息。Provider通过uri去访问,返回游标(cursor),我们将通过下面的小例子进行验证,先进行Uri的了解,然后对cursor进行二次轮询,一次采用while,一次采用for方式。正如前面的contactprovider在xml的定义所示,有读写权限限制,因此在XML中应赋予相应的权限:<uses-permissionandroid:name="android.permission.READ_CONTACTS"/>
privatevoid contentProviderTest(){ |
Where条件的用法。查找特定的数据,可以利用Uri,也可以利用manageQuery()方法的参数。例如希望查询select* from notes where _id=23,利用Uri,可以设置为
String noteUri =“content://com.google.progider.NotePad/notes/23”;
利用manageQuery()中的selection擦数,同样可以表达为
managedQuery(uri, //为"content://com.google.provider.NotePad/notes"
null,
"_id=?" ,
new String[] {23} ,
null);
增加、修改、删除数据。增删改查是数据读写的四大功能,我们将在后面的小例子中给出详细的说明。
相关链接: 我的Android开发相关文章