***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)、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在其它应用第一次访问它时才会被创建。
public Uriinsert(Uri uri, ContentValues values):该方法用于供外部应用往ContentProvider添加数据。
public intdelete(Uri uri, String selection, String[] selectionArgs):该方法用于供外部应用从ContentProvider删除数据。
public intupdate(Uri uri, ContentValues values, String selection, String[] selectionArgs):该方法用于供外部应用更新ContentProvider中的数据。
public Cursorquery(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder):该方法用于供外部应用从ContentProvider中获取数据。
public StringgetType(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, ContentValuesvalues):该方法用于往ContentProvider添加数据。
public int delete(Uri uri, String selection,String[] selectionArgs):该方法用于从ContentProvider删除数据。
public int update(Uri uri, ContentValuesvalues, String selection, String[] selectionArgs):该方法用于更新ContentProvider中的数据。
public Cursor query(Uri uri, String[]projection, String selection, String[] selectionArgs, String sortOrder):该方法用于从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 staticfinal Uri CONTENT_URI =Uri.parse("content://com.WangWeiDa.MyContentprovider");
如果有子表,URI为:
Public staticfinal Uri CONTENT_URI =Uri.parse("content://com.WangWeiDa.MyContentProvider/users");
2、定义一个类,继承ContentProvider
Public classMyContentProvider extends ContentProvider
3、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)
package com.WangWeiDa.cp;