ContentProvider

来源:互联网 发布:淘宝直播添加到首页 编辑:程序博客网 时间:2024/04/30 01:41

ContentProvider数据存储组件

1.ContentProvider是什么(What)
ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider
1)Android中的一个应用组件(作为应用组件的
   表现是生命周期方法)
2)Android中的内容提供者(一般是内部存储中的数据)
 
2.ContentProvider对象的应用场合(When)
 
当android中的一个app私有数据要共享给其它应用时,可以借助ContentProvider实现。
 
例如:
1)微信访问手机中联系人数据
2)支付宝访问手机中联系人数据
3).......
 
ContentProvider能够实现进程间私有数据的访问。
 
1)ContentProvider为存储和读取数据提供了统一的接口
2) 使用ContentProvider,应用程序可以实现数据共享
3)android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)
总的来说使用ContentProvider对外共享数据的好处是统一了数据的访问方式。
 
3.ContentProvider在实际项目中的应用?how
 
假设现有一个A进程,它需要将其私有数据共享给
其它进程(例如B进程),此时可以在A进程端创建
ContentPrivider对象,并对外公布一个URI.此时
假如B进程想访问A进程中的私有数据,可以借助
B端的ContentResolver对象,通过A发布的URI
对象找到A的ContentProvider对象进行访问就可
以了。
 
说明:
我们的重点不是要写一个ContentProvider,重点
是理解过程,并能够应用ContentResolver去访
问别人的ContentProvider(例如系统的媒体库)。
 
案例:参考
1)Day16_component_1(contentprovider)
2)Day16_component_2(contentresolver)
1)、ContentProvider使用表的形式来组织数据
   无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格
2)、ContentProvider提供的方法
   query:查询
   insert:插入
   update:更新
   delete:删除
   getType:得到数据类型
   onCreate:创建数据时调用的回调函数
3)、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中
使用ContentProvider共享数据


1)ContentProvider类主要方法的作用:
public boolean onCreate():该方法在ContentProvider创建后就会被调用,Android开机后,ContentProvider在其它应用第一次访问它时才会被创建。
publicUri insert(Uri uri, ContentValues values):该方法用于供外部应用往ContentProvider添加数据。
publicint delete(Uri uri, String selection, String[] selectionArgs):该方法用于供外部应用从ContentProvider删除数据。
publicint update(Uri uri, ContentValues values, String selection, String[]selectionArgs):该方法用于供外部应用更新ContentProvider中的数据。
publicCursor query(Uri uri, String[] projection, String selection, String[]selectionArgs, String sortOrder):该方法用于供外部应用从ContentProvider中获取数据。
publicString getType(Uri uri):该方法用于返回当前Url所代表数据的MIME类型
2)如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,
例如:要得到所有person记录的Uri为content://com.bing.provider.personprovider/person,那么返回的MIME类型字符串应该为:"vnd.android.cursor.dir/person"。
1)如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,例如:得到id为10的person记录,Uri为content://com.bing.provider.personprovider/person/10,那么返回的MIME类型字符串为:"vnd.android.cursor.item/person"。
 
ContentResolver操作ContentProvider中的数据


 
1)当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。
 
2)ContentResolver 类提供了与ContentProvider类相同签名的四个方法:
public Uri insert(Uri uri,ContentValues values):该方法用于往ContentProvider添加数据。
public int delete(Uri uri, Stringselection, String[] selectionArgs):该方法用于从ContentProvider删除数据。
public int update(Uri uri,ContentValues values, String selection, String[] selectionArgs):该方法用于更新ContentProvider中的数据。
public Cursor query(Uri uri,String[] projection, String selection, String[] selectionArgs, StringsortOrder):该方法用于从ContentProvider中获取数据。
 
这些方法的第一个参数为Uri,代表要操作的ContentProvider和对其中的什么数据进行操作,
其实和contentprovider里面的方法是一样的.他们所对应的数据,最终是会被传到我们在之前程序里面定义的那个contentprovider类的方法,
假设给定的是:Uri.parse("content://com.bing.providers.personprovider/person/10"),那么将会对主机名为com.bing.providers.personprovider的ContentProvider进行操作,操作的数据为person表中id为10的记录。
 
监听ContentProvider中数据的变化
如果ContentProvider的访问者需要知道ContentProvider中的数据发生变化,可以在ContentProvider发生数据变化时调用getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者
如果ContentProvider的访问者需要得到数据变化通知,必须使用ContentObserver对数据(数据采用uri描述)进行监听,当监听到数据变化通知时,系统就会调用ContentObserver的onChange()方法
ContentProvider的内部原理


  自定义一个ContentProvider,来实现内部原理
  步骤:
  1、定义一个CONTENT_URI常量(里面的字符串必须是唯一)
  Public static final Uri CONTENT_URI =Uri.parse("content://com.WangWeiDa.MyContentprovider");
  如果有子表,URI为:
  Public static final Uri CONTENT_URI =Uri.parse("content://com.WangWeiDa.MyContentProvider/users");
  2、定义一个类,继承ContentProvider
  Public class MyContentProvider extends ContentProvider
  3、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)
package com.WangWeiDa.cp;


0 0
原创粉丝点击