ContentProvider数据共享
在某些情况下,Android应用程序需要对外暴露自己的数据,以便其他应用程序进行访问,从而完成系统中不同Android应用程序之间的数据共享,这就需要使用ContentProvider。
ContentProvider是不同应用程序之间进行数据交换的标准API,也是所有应用程序之间数据存储和检索的桥梁。
ContentProvider类中的数据操作方法多数为抽象方法,需要实现这些方法;方法中用到Uri参数
Uri是ContentProvider对外提供一个自身数据集的唯一标识
ContentProvider将会为每个数据集分配一个独立且唯一的Uri
UriMatcher工具类对Uri进行匹配判断,该工具类提供了两个方法∶
void addURI(String authority,String path,int code)
用于注册Uri
authority和path组合成一个Uri ; Code代表Uri对应的标识码
int match(Uri uri)
根据前面注册的Uri判断指定的Uri对应的标识码,如果找不到匹配的标识码则返回-1
ContentUris工具类,用于操作Uri字符串,该工具类提供了两个方法∶
withAppendedld(uri,id)∶用于为Uri路径加上ID部分
parseld(uri)∶用于从指定的uri中解析出所包含的lD值
ContentResolver用来间接操作ContentProvider中的数据
通过Context的getContentResolver()方法来获取ContentResolver实例对象
ContentProvider程序
开发ContentProvider程序的步骤︰
创建一个ContentProvider子类,实现增删改查等抽象方法;
在AndroidManifest.xml配置文件中注册ContentProvider,并指定android:authorities属性;
通过Activity使用ContentProvider。Activity和Service等组件都可以获取ContentProvider对象,并调用该对象相应的方法进行操作。
创建ContentProvider子类
//创建一个继承于contentProvider的类
public class FirstProvider extends ContentProvider {
//第一次创建该coontentProvide时调用该方法
override
public boolean onCreate ( ) {
Log.i ( "FirstProvider" , "===onCreate方法被调用===") ;return true;
)
...--
ContentProvider子类中实现query()方法(2/7 )
..…
<!--实现查询方法,该方法返回查询得到的cursor -->
@override
public Cursor query(Uri uri,string[] projection,string where,string []whereArgs,string sortorder) {
Log.i ( "FirstProvider" , "===query方法被调用===") ;
Log.i("FirstProvider" , "uri参数为: "+uri+"where参数为: "+where) ;return null;
ContentProvider子类中实现insert()方法
<!--实现插入的方法,该方法应该返回新插入的记录的uri -->
@override
public Uri insert (Uri uri, Contentvalues values) {
Log.i ( "FirstProvider" , "===insert方法被调用===") ;Log.i("FirstProvider" , "values参数为: "+values ) ;return uri;
)
ContentProvider子类中实现update()方法
<! --实现更新方法,该方法应该返回被更新的记录条数-->
@override
public int update(Uri uri,Contentvalues values,string where,
string [ ] whereArgs) {
Log.i ( "FirstProvider" , "===update方法被调用===") ;
Log.i ( "FirstProvider", "where参数为:"+where+" , values参数为:"+values) ;
return l;
}
ContentProvider子类中实现delete()方法
<! --实现删除方法,该方法应该返回被删除的记录条数-->
@override
public int delete(Uri uri,string where,string [ ] whereArgs){
Log.i ( "FirstProvider" , "===delete方法被调用===" ) ;
Log.i ( "FirstProvider" , "where参数为: "+where) ;return l;
)
使用
<provider>子元素注册ContentProvider<!--注册一个contentProvider -->
<provider
android : name=". FirstProvider"
android:authorities="com.qst.chapter07.Firstprovider"android:exported="true">
</provider>
name属性指定ContentProvider的实现类
authorities属性指定该ContentProvider对应的Uri
exported属性指定该ContentProvider是否允许其他应用调用
使用ContentProvider操作数据
Uri uri=Uri.parse ( "content : / / com.qst.chapter08.firstprovider/ " );
ContentResolver contentResolver=getContentResolver ( );…-
cursor
c=contentResolver. query (uri, null , "query_where" , null,null);...
Uri newUri=contentResolver.insert(uri, values) ;
contentResolver.update (uri, values, "update_where" , null);
contentResolver.delete (uri , "delete_where" , null) ;
操作系统的ContentProvider
Android系统本身提供了大量的ContentProvider,例如联系人信息、系统的多媒体信息等。
开发人员可以通过ContentResolver来调用系统ContentProvider所提供的增删改查方法来对Android内部数据进行操作。
Android系统用于管理联系人的ContentProvider的Uri有以下三种:
ContactsContract.Contacts.CONTENT_URI∶管理联系人的Uri
ContactsContract.CommonDataKinds.Phone.CONTENT_URI∶管理联系人的电话Uri
ContactsContract.CommonDataKinds.Email.CONTENT_URI∶管理联系人的E-mail的Uri
Android系统为多媒体提供了相应的ContentProvider的Uri :
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI∶存储在外部SD存储卡中的音频文件的Uri
MediaStore.Audio.Media.INTERNAL_CONTENT_URI∶存储在手机内存中的音频文件的Uri
MediaStore.Images.Media.EXTERNAL_CONTENT_URI∶存储在外部SD存储卡中的图片文件的Uri

