ContentProvider在Android中的做用是对外提供数据,除了能够为所在应用提供
数据外,还能够共享数据给其余应用,这是Android中解决应用之间数据共享的
机制。经过ContentProvider咱们能够对数据进行增删改查的操做。当应用须要
经过ContentProvider对外共享数据时,具体做法以下: android
在重写这些方法时,根据所采用的数据存储方式进行相应修改。一般使用的
是SQLite数据库存储,咱们须要新建数据库操做类,并在增删改查方法中完
成对数据库的操做。git
法context.getContentResolver()才能找到咱们重写的ContentProvider。在注
册ContentProvider时,采用了authorities(主机名/域名)的方法对它进行
惟一标识,ContentProvider的标识相似于网站的域名,经过此域名咱们能够
准确访问到对应网站,网站为咱们提供数据。Authorities就是ContentProvider
的域名。注册方法以下:github
Uri 表明了要操做的数据,Uri 主要包含了两部分信息:一、须要操做的
ContentProvider;二、对ContentProvider中的什么数据进行操做。一个Uri由以
下几部分组成:
数据库
ContentProvider的scheme已经由Android所规定,scheme为content://。
主机名(authorities)用于惟一标识这个ContentProvider,外部调用者能够根据
它找到对应的内容提供者(ContentProvider)。
路径(Path)能够用来表示咱们要操做的数据,路径的构建应该根据业务而定,
以下:
要操做Person表中ID 为10的记录,能够构建这样的路径:/person/id/10,也
能够为/prson/10,构建什么样的路径须要与UriMatcher中注册的匹配Uri相一
致。例如:/person/id/10,那么匹配Uri须要也须要带id 为/preson/id/#,不然
能够写成/person/10.
要操做person表中的全部记录,能够这样构建路径:/person
若是要把一个字符串转换成Uri,可使用Uri类中的parse()方法。以下:
Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person") app
由于Uri表明了要操做的数据,因此咱们常常须要解析Uri,并从Uri中获取数
据。Android提供了两个用于操做Uri的工具类,分别为UriMatcher和ContentUris。
UriMatcher类用于匹配Uri,用法以下:
一、 首先须要把匹配的Uri路径所有进行注册,以下:ide
注册完须要匹配的Uri后,就可使用sMatcher.match(uri)对输入的uri进
匹配,若是匹配正确就返回匹配码,匹配码是addUri()方法传入的第三个
数,假设匹配content://com.ljq.provider.personprovider/person 路径,返回
匹配码为1。 工具
ContentUris用于操做Uri后面的ID 部分,它有两个实用的方法:
WithAppendedId(uri, id)用于为uri路径加上id 部分,以下: 网站
ContentProvider类主要方法的做用:
一、 public boolean onCreate():该方法在ContentProvider 建立后就会被调用,
Android开机后,ContentProvider在其它应用第一次访问它时才会被建立。
二、 public int insert():该方法用于宫外部应用为ContentProvider中添加数据使
用。
三、 public int delete(Uri uri, String selection, 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, String sortOrder):该方法用于供外部应用查询ContentProvider
中的数据。
六、 public String getType(uri):该方法用于返回当前uri表明数据的MIME类型。
若是操做的数据属于集合类型,那么MIME类型字符串应该以
vnd.android.cursor.dir/开头,例如,要获得全部person记录的Uri为
content://com.ljq.provider.personprovider/person,那么返回的MIME类型字
符串应该为:"vnd.android.cursor.dir/person"。
若是要操做的数据类型为非集合类型,那么MIME类型字符串应该以
vnd.android.cursor.item/开头。例如:获得id 为10的person记录,Uri为
content://com.ljq.provider.personprovider/person/10,那么返回的MIME类型
字符串为:"vnd.android.cursor.item/person"。 spa
当外部应用须要对ContentProvider 中的数据进行操做时,可使用
ContentResovler来完成,可使用Activity的getContentResovler()方法来获取
CountentResovler对象。ContentResovler提过了和ContentProvider相似的四个
方法:
public Uri insert(Uri uri, ContentValues values):该方法用于往ContentProvider
添加数据。
public int delete(Uri uri, String selection, 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, String sortOrder):该方法用于从ContentProvider中获取数据。
这些方法的第一个参数为uri,表明要操做的ContentProvider和对其中的什么数
据进行操做,假设给定的是:
Uri.parse("content://com.ljq.providers.personprovider/person/10"),那么将会对
主机名为com.ljq.providers.personprovider的ContentProvider进行操做,操做的数
据为person表中id为10的记录。
使用ContentResovler对ContentProvider中的数据进行增删改查操做,以下: .net
若是ContentProvider的访问者须要知道ContentProvider中数据发生变化,能够
在ContentProvider中数据发生变化时调用getContentResovler().notifyChange(uri,
null)来通知注册在此uri上的访问者,以下:
若是ContentProvider 的访问者须要获得数据变化通知,必须使用
ContentObserver对数据(数据采用Uri描述)进行监听,当监听到数据变化通
知时,系统就会调用ContentObserver的onChange()方法,以下:
项目地址: