美文网首页
ContentProvider

ContentProvider

作者: xbase | 来源:发表于2018-07-31 10:16 被阅读6次

    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

    相关文章

      网友评论

          本文标题:ContentProvider

          本文链接:https://www.haomeiwen.com/subject/kgphpftx.html