android Content Provider的使用.docx
《android Content Provider的使用.docx》由会员分享,可在线阅读,更多相关《android Content Provider的使用.docx(26页珍藏版)》请在冰豆网上搜索。
androidContentProvider的使用
我们大家都知道让自己的数据和其它应用程序共享有两种方式:
创建自己的ContentProvider(即继承自ContentProvider的子类)或者是将自己的数据添加到已有的ContentProvider中去,后者需要保证现有的ContentProvider和自己的数据类型相同并且具有该ContentProvider的写入的权限。
如果需要创建一个ContentProvider,则需要进行的工作主要分为以下3个步骤。
(1)建立数据的存储系统
数据的存储系统可以由开发人员任意决定,一般来讲,大多数的ContentProvider都通过Android的文件存储系统或SQLite数据库建立自己的数据存储系统。
(2)扩展ContentProvider类
开发一个继承自ContentProvider类的子类代码来扩展ContentProvider类,在这个步骤主要的工作是将要共享的数据包装并以ContentResolver和Cursor对象能够访问到的形式对外展示。
具体来说需要实现ContentProvider类中的6个抽象方法。
Cursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder):
将查询的数据以Cursor对象的形式返回。
Uriinsert(Uriuri,ContentValuesvalues):
向ContentProvider中插入新数据记录,ContentValues为数据记录的列名和列值映射。
intupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs):
更新ContentProvider中已存在的数据记录。
intdelete(Uriuri,Stringselection,String[]selectionArgs):
从ContentProvider中删除数据记录。
StringgetType(Uriuri):
返回ContentProvider中的数据(MIME)类型。
booleanonCreate():
当ContentProvider启动时被调用。
以上方法将会在ContentResolver对象中调用,所以很好地实现这些抽象方法会为ContentResolver提供一个完善的外部接口。
除了实现抽象方法外,还可以做一些提高可用性的工作。
定义一个URI类型的静态常量,命名为CONTENT_URI。
必须为该常量对象定义一个唯一的URI字符串,一般的做法是将ContentProvider子类的全称类名作为URI字符串,如:
"content:
//wyf.wpf.MyProvider"。
定义每个字段的列名,如果采用的数据库存储系统为SQLite数据库,数据表列名可以采用数据库中表的列名。
不管数据表中有没有其他的唯一标识一个记录的字段,都应该定义一个"_id"字段来唯一标识一个记录。
模式使用"INTEGERPRIMARYKEYAUTOINCREMENT"自动更新一般将这些列名字符串定义为静态常量,如"_id"字段名定义为一个名为"_ID"值为"_id"的静态字符串对象。
(3)在应用程序的AdnroidManifest.xml文件中声明ContentProvider组件。
创建好一个ContentProvider必须要在应用程序的AndroidManifest.xml中进行声明,否则该ContentProvider对于Android系统将是不可见的。
如果有一个名为MyProvider的类扩展了ContentProvider类,声明该组件的代码如下:
Xml代码
1.2.authorities="wyf.wpf.myprovider"
3....../>
--为标记添加name、authorities属性-->
authorities="wyf.wpf.myprovider"
...../>
--为标记添加name、authorities属性-->
其中name属性为ContentProvider子类的全称类名,authorities属性唯一标识了一个ContentProvider。
还可以通过setReadPermission()和setWritePermission()来设置其操作权限。
当然也可以再上面的xml中加入android:
readPermission或者android:
writePermission属性来控制其权限。
注意:
因为ContentProvider可能被不同的进程和线程调用,所以这些方法必须是线程安全的。
下边是一个例子修改了SDK中的Notes例子。
首先创建ContentProvider的CONTENT_URI和一些字段数据,字段类可以继承自BaseColumns类,它包括了一些基本的字段,比如:
_id等代码如下:
NotePad类
Java代码
1.packagexiaohang.zhimeng;
2.
3.import.Uri;
4.importandroid.provider.BaseColumns;
5.
6.publicclassNotePad{
7.//ContentProvider的uri
8.publicstaticfinalStringAUTHORITY="com.xh.google.provider.NotePad";
9.
10.privateNotePad(){}
11.
12.//定义基本字段实现BaseColumns这个接口里边已经定义了"_id"字段所以这里不用定义了
13.publicstaticfinalclassNotesimplementsBaseColumns{
14.privateNotes(){}
15.
16.//Uri.parse方法根据指定字符串创建一个Uri对象
17.publicstaticfinalUriCONTENT_URI=Uri.parse("content:
//"+AUTHORITY+"/notes");
18.
19.//新的MIME类型-多个
20.publicstaticfinalStringCONTENT_TYPE="vnd.android.cursor.dir/vnd.google.note";
21.
22.//新的MIME类型-单个
23.publicstaticfinalStringCONTENT_ITME_TYPE="vnd.android.cursor.item/vnd.google.note";
24.
25.publicstaticfinalStringDEFAULT_SORT_ORDER="modifiedDESC";
26.
27.//字段
28.publicstaticfinalStringTITLE="title";
29.publicstaticfinalStringNOTE="note";
30.publicstaticfinalStringCREATEDDATE="created";
31.publicstaticfinalStringMODIFIEDDATE="modified";
32.}
33.}
packagexiaohang.zhimeng;
import.Uri;
importandroid.provider.BaseColumns;
publicclassNotePad{
//ContentProvider的uri
publicstaticfinalStringAUTHORITY="com.xh.google.provider.NotePad";
privateNotePad(){}
//定义基本字段实现BaseColumns这个接口里边已经定义了"_id"字段所以这里不用定义了
publicstaticfinalclassNotesimplementsBaseColumns{
privateNotes(){}
//Uri.parse方法根据指定字符串创建一个Uri对象
publicstaticfinalUriCONTENT_URI=Uri.parse("content:
//"+AUTHORITY+"/notes");
//新的MIME类型-多个
publicstaticfinalStringCONTENT_TYPE="vnd.android.cursor.dir/vnd.google.note";
//新的MIME类型-单个
publicstaticfinalStringCONTENT_ITME_TYPE="vnd.android.cursor.item/vnd.google.note";
publicstaticfinalStringDEFAULT_SORT_ORDER="modifiedDESC";
//字段
publicstaticfinalStringTITLE="title";
publicstaticfinalStringNOTE="note";
publicstaticfinalStringCREATEDDATE="created";
publicstaticfinalStringMODIFIEDDATE="modified";
}
}
然后我们需要来创建自己的ContentProvider类的NotePadProvider,它包括了查询、添加、删除、更新等操作以及打开和创建数据库,代码如下:
NotePadProvider类
Java代码
1.packagexiaohang.zhimeng;
2.
3.importjava.util.HashMap;
4.importxiaohang.zhimeng.NotePad.Notes;
5.importandroid.content.ContentProvider;
6.importandroid.content.ContentUris;
7.importandroid.content.ContentValues;
8.importandroid.content.Context;
9.importandroid.content.UriMatcher;
1