ContentProvider

2018-07-31  本文已影响6人  xbase

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
上一篇下一篇

猜你喜欢

热点阅读