ContentProvider
本质:Android中的Binder机制。

原则:中间件,负责和数据存储交互,并把结果返还给跨进程的调用者。
结构:

统一资源标识符(URI)

MIME数据类型
格式:父类型/子类型
父类型两种类型:
1.vnd.android.cursor.dir(多条记录)
2.vnd.android.cursor.item(单挑记录)
子类型可以自定义
例子:vnd.android.cursor.dir/vnd.yourcompany.contenttype
结构
必须实现的方法:
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 中的数据
// 注:
// 1. 上述4个方法由外部进程回调,并运行在ContentProvider进程的Binder线程池中(不是主线程)
// 2. 存在多线程并发访问,需要实现线程同步
// a. 若ContentProvider的数据存储方式是使用SQLite & 一个,则不需要,因为SQLite内部实现好了线程同步,若是多个SQLite则需要,因为SQL对象之间无法进行线程同步
// b. 若ContentProvider的数据存储方式是内存,则需要自己实现线程同步
<-- 2个其他方法 -->
public boolean onCreate()
// ContentProvider创建后 或 打开系统后其它进程第一次访问该ContentProvider时 由系统进行调用
// 注:运行在ContentProvider进程的主线程,故不能做耗时操作
public String getType(Uri uri)
// 得到数据类型,即返回当前 Url 所代表数据的MIME类型
ContentResolver类
为什么不直接使用ContentProvider?因为一个应用有多个contentProvider,要是需要了解每个contentProvider的内部结构在去使用,操作成本太大,ContentResolver的作用就是一个统一的功能。
辅助类
UriMatcher:
把每个表和一个int值对应,查找时返回此int值。
ContentObserver:
1.一个观察者,使用getContentResolver().registerContentObserver(uri)注册,getContentResolver().unregisterContentObserver(uri)解注册
2.getContext().getContentResolver().notifyChange(uri, null)发送通知
ContentUris:
1.ContentUris.parseId(URL)获取具体哪条记录
2.withAppendedId()向url追加一条记录的id
网友评论