您的位置:首页 > 移动开发 > Android开发

Android 中的应用组件之----Content Provider (跨进程私有数据共享)

2016-05-09 19:27 621 查看

***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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: