1.ContentProvider是什么?
ContentProvider(内容提供者)是Android的四大组件之一,管理android以结构化方式存放的数据,以相对安全的方式封装数据(表)并且提供简易的处理机制和统一的访问接口供其他程序调用。
Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。但一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,就会用到ContentProvider。而且Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。
但注意ContentProvider它也只是一个中间人,真正操作的数据源可能是数据库,也可以是文件、xml或网络等其他存储方式。
2.URL
URL(统一资源标识符)代表要操作的数据,可以用来标识每个ContentProvider,这样你就可以通过指定的URI找到想要的ContentProvider,从中获取或修改数据。
在Android中URI的格式如下图所示:
A
schema,已经由Android所规定为:content://.
B
主机名(Authority),是URI的授权部分,是唯一标识符,用来定位ContentProvider。
C部分和D部分:是每个ContentProvider内部的路径部分
C
指向一个对象集合,一般用表的名字,如果没有指定D部分,则返回全部记录。
D
指向特定的记录,这里表示操作user表id为7的记录。如果要操作user表中id为7的记录的name字段, D部分变为/7/name即可。
URI模式匹配通配符
*:匹配的任意长度的任何有效字符的字符串。
#:匹配的任意长度的数字字符的字符串。
如:
content://com.example.app.provider/*
匹配provider的任何内容url
content://com.example.app.provider/table3/#
匹配table3的所有行
2.1MIME
MIME是指定某个扩展名的文件用一种应用程序来打开,就像你用浏览器查看PDF格式的文件,浏览器会选择合适的应用来打开一样。Android中的工作方式跟HTTP类似,ContentProvider会根据URI来返回MIME类型,ContentProvider会返回一个包含两部分的字符串。MIME类型一般包含两部分,如:
text/html
text/css
text/xml
application/pdf
分为类型和子类型,Android遵循类似的约定来定义MIME类型,每个内容类型的Android MIME类型有两种形式:多条记录(集合)和单条记录。
集合记录:
11单条记录:
11vnd表示这些类型和子类型具有非标准的、供应商特定的形式。Android中类型已经固定好了,不能更改,只能区别是集合还是单条具体记录,子类型可以按照格式自己填写。
在使用Intent时,会用到MIME,根据Mimetype打开符合条件的活动。
下面分别介绍Android系统提供了两个用于操作Uri的工具类:ContentUris和UriMatcher。
2.2 ContentUris
ContetnUris包含一个便利的函数withAppendedId()来向URI追加一个id。
12341234同时提供parseId(uri)方法用于从URL中获取ID:
1231232.3UriMatcher
UriMatcher本质上是一个文本过滤器,用在contentProvider中帮助我们过滤,分辨出查询者想要查询哪个数据表。
举例说明:
第一步,初始化:1212第二步,注册需要的Uri:12341234第三部,与已经注册的Uri进行匹配:123456789101112131412345678910111213143.ContentProvider的主要方法
public boolean onCreate()
ContentProvider创建后 或 打开系统后其它应用第一次访问该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中获取数据。
public String getType(Uri uri)
该方法用于返回当前Url所代表数据的MIME类型。
4.ContentResolver
ContentResolver通过URI来查询ContentProvider中提供的数据。除了URI以 外,还必须知道需要获取的数据段的名称,以及此数据段的数据类型。如果你需要获取一个特定的记录,你就必须知道当前记录的ID,也就是URI中D部分。
ContentResolver 类提供了与ContentProvider类相同签名的四个方法:
public Uri insert(Uri uri, ContentValues values) //添加
public int delete(Uri uri, String selection, String[] selectionArgs) //删除
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) //更新
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)//获取
实例代码:
1234567891011121314151617181920212223241234567891011121314151617181920212223245.ContentObserver
ContentObserver(内容观察者),目的是观察特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849501234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950同时可以在ContentProvider发生数据变化时调用
getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者。
6.实例说明
数据源是SQLite, 用ContentResolver操作ContentProvider。
Constant.Java(储存一些常量)
12345678910111213141516171234567891011121314151617DBHelper.java(操作数据库)
12345678910111213141516171819202122231234567891011121314151617181920212223MyProvider.java(自定义的ContentProvider)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485861234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586MainActivity.java(ContentResolver操作)
12345678910111213141516171819202122232425262728291234567891011121314151617181920212223242526272829最后在manifest申明
11本文中代码下载