android四大组件之 - ContentProvider内容提供者

创建一个内容提供者的基本步骤

一:(1)创建一个内容提供者要 extends ContentProvider(继承他)
   (2)清单文件增加<provider>节点,而且必须要加一个主机名android:authorities="主机名"
   (3)如果在4.1之后还要配权限 android:exported="true"
二:(1)在onCreate方法得到数据库的对象,因为在onCreate方法里面才可以的得到上下文
   (2)编写静态代码块,增加匹配规则    //(  UriMatcher Uri匹配的规则对象  )
   (3)编写增删改查方法              //要使用匹配规则的限定
   (4)如果需要内容观察者可以注册内容观察者   //可以使用registerContentObserver监听数据的修改

内容接受者(解析者的基本步骤)

一:(1)通过上下文.getContentResolver()得到内容接受者的对象
   (2)得到内容提供者的Uri           Uri的前缀 "content://清单文件配置的主机名/路径"  
   (3)调用里面的增加改查 
   (4)可以得到内容观察者,监听数据的修改
'得到ContentProviderClient
private static ContentProviderClient acquireContentProviderClient(Context context, Uri uri) {
    if (VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        return context.getContentResolver().acquireUnstableContentProviderClient(uri);
    }
    return context.getContentResolver().acquireContentProviderClient(uri);
}

API

  • ContentProvider 内容提供者
onCreate                    内容提供者创建的时候回调
insert()                    增加一条数据
update()                    修改一条数据
delete()                    删除一条数据
query()                     查询数据
  • ContentObserver 内容观察者,监听数据的修改
MyContentObserver()
onChange()                  数据库有变化时候回调
  • ContentResolver ‘内容接受者
insert()                    增加一条数据
update()                    修改一条数据
delete()                    删除一条数据
query()                     查询数据
registerContentObserver()   注册内容观察者
unregisterContentObserver() 移除观察者
notifyChange()              给内容观察者发送一个通知,通知内容观察者数据变化了
  • 内容提供者的增删改成方法
1 增加   contentResolver.insert(Uri,Values增加的数据);

2 删除     contentResolver.delete(Uri,删除的条件,删除条件的数组);

3 修改     contentResolver.update(Uri,values修改的数据, 修改的条件, 修改条件的数组);

4 查询     contentResolver.update(Uri,需要查询的'列'名称数组, 查询的条件, 查询条件的数组, 排序方式)
    参数解析
    Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal
        1 uri               Uri
        2 projection        需要查询的'列'名称数组,null代表查询全部列
        3 selection         查询的条件
        4 selectionArgs     查询条件的数组
        5 sortOrder         如何订单行,格式化为一个SQL order BY子句(不含订单本身)。通过零将使用默认的排序顺序,这可能是无序的。
        6 CancellationSignal一个信号取消操作,或者零如果没有。如果操作取消,那么OperationCanceledException执行查询时将抛出。  这个一般不写
  • Activity
getContentResolver() '得到内容接受者
  • ContentValues
put("conten://主机名/口令")      增加数据
  • Uri ‘统一资源标识符,简称URI
parse()                         得到Uri//[字符串] //访问内容提供者 uri字符串前面应该加content://主机名/路径
  • UriMatcher ‘Uri匹配的规则对象
new UriMatcher(UriMatcher.NO_MATCH) 
NO_MATCH                        -1
addURI()                        增加一个主机名下的路径和一个口令//[主机名,路径,口令]   那么需要访问的话就要content://主机名/路径  
match()                         得到指定Uri匹配的口令//[Uri主机名]
  • 主机名
"content://call_log/calls"      呼叫记录(CallLog.Calls.CONTENT_URI也可以)

ContentUris.withAppendedId(uri, id);    //拼接uri

简单的内容观察者,和给内容观察者发送通知

--//发送一个通知,通知内容观察者某个路径的数据变化了
        Uri uri = Uri.parse("content://com.itheima.mobilesafe.applockdb");
        context.getContentResolver().notifyChange(uri, null);//null所有的观察者

--//接受发送的通知
        getContentResolver().registerContentObserver(uri, true, new MyContentObserver(new Handler()));
--//观察者对象重写onChange()方法
     private class MyContentObserver extends ContentObserver {

        public MyContentObserver(Handler handler) {
            super(handler);

        }
        @Override
        public void onChange(boolean selfChange) {
            Log.i(TAG, "数据库有变化了: ");
            super.onChange(selfChange);
        }
    }

猜你喜欢

转载自blog.csdn.net/binbin594738977/article/details/81544251
今日推荐