欢迎光临散文网 会员登陆 & 注册

ContentProvider数据共享

2021-07-07 16:18 作者:独行D暗灵  | 我要投稿

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程序的步骤︰

    1. 创建一个ContentProvider子类,实现增删改查等抽象方法;

    2. 在AndroidManifest.xml配置文件中注册ContentProvider,并指定android:authorities属性;

    3. 通过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



ContentProvider数据共享的评论 (共 条)

分享到微博请遵守国家法律