创建一个内容提供者的基本步骤
一:(1)创建一个内容提供者要 extends ContentProvider(继承他)
(2)清单文件增加节点,而且必须要加一个主机名android:authorities="主机名"
(3)如果在4.1之后还要配权限 android:exported="true"
二:(1)在onCreate方法得到数据库的对象,因为在onCreate方法里面才可以的得到上下文
(2)编写静态代码块,增加匹配规则
(3)编写增删改查方法
(4)如果需要内容观察者可以注册内容观察者
内容接受者(解析者的基本步骤)
一:(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
onCreate 内容提供者创建的时候回调
insert() 增加一条数据
update() 修改一条数据
delete() 删除一条数据
query() 查询数据
- ContentObserver 内容观察者,监听数据的修改
MyContentObserver()
onChange() 数据库有变化时候回调
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执行查询时将抛出。 这个一般不写
getContentResolver() '得到内容接受者
put("conten://主机名/口令") 增加数据
parse() 得到Uri//[字符串] //访问内容提供者 uri字符串前面应该加content://主机名/路径
new UriMatcher(UriMatcher.NO_MATCH)
NO_MATCH -1
addURI() 增加一个主机名下的路径和一个口令
match() 得到指定Uri匹配的口令
"content://call_log/calls" 呼叫记录(CallLog.Calls.CONTENT_URI也可以)
ContentUris.withAppendedId(uri, id)
简单的内容观察者,和给内容观察者发送通知
--
Uri uri = Uri.parse("content://com.itheima.mobilesafe.applockdb");
context.getContentResolver().notifyChange(uri, null);
--
getContentResolver().registerContentObserver(uri, true, new MyContentObserver(new Handler()));
--
private class MyContentObserver extends ContentObserver {
public MyContentObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
Log.i(TAG, "数据库有变化了: ");
super.onChange(selfChange);
}
}