内容提供者
来源:互联网 发布:drcom校园网客户端mac 编辑:程序博客网 时间:2024/03/29 21:04
内容提供者
什么是内容提供者
在安卓系统中,各应用之间的数据信息是无法直接传递共享的,因此,系统提供了一个组件,用来把系统私有的数据库暴漏给其他应用使用,这就是内容提供者
内容提供者有什么用
内容提供者可以将私有的数据库暴漏给其他应用使用,这样不仅方便了资源共享,另一方面也保证了私有数据库的安全
内容提供者怎么用
①创建内容提供者 (写一个类继承contentprovider 清单文件声明 实现gettype insert update delete query oncreate 五个方法
<providerandroid:name=".MyContentProvider"android:exported="true" android:enabled="true"android:authorities="com.itheima.mydataprovider"/>
android:authorities 通过这个字符串匹配唯一的内容提供者 尽量使用公司域名的倒写开头 避免跟其他应用冲突exported一定设置为true
② onCreate中创建一个openHelper对象 通过这个openHelper帮助打开数据库
public boolean onCreate() { // 当内容提供者创建的时候 会走这个方法 //在这里可以创建openHelper但是不要打开数据库 openHelper = new MyOpenHelper(getContext()); return false;}
③ 创建一个UriMatcher对象 通过这个对象帮助处理uri的路径添加 以及路径的匹配 并且 通过UriMatcher 添加一系列的路径
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int QUERY_MATCHED = 1;private static final int INSERT_MATCHED = 2;private static final int UPDATE_MATCHED = 3;private static final int DELETE_MATCHED = 4;static { //给匹配器添加 匹配规则(添加新的uri路径) sURIMatcher.addURI("com.itheima.mydataprovider", "query", QUERY_MATCHED); sURIMatcher.addURI("com.itheima.mydataprovider", "insert", INSERT_MATCHED); sURIMatcher.addURI("com.itheima.mydataprovider", "update", UPDATE_MATCHED); sURIMatcher.addURI("com.itheima.mydataprovider", "delete", DELETE_MATCHED); // content://authorities/子路径 //content://com.itheima.mydataprovider/query}
④ 实现update insert delete query的方法
先判断uri 再根据uri的匹配结果 操作SQLiteDatabase
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int match = sURIMatcher.match(uri);
if(DELETE_MATCHED == match){
SQLiteDatabase db = openHelper.getReadableDatabase();
int result = db.delete(“info”, selection, selectionArgs);
db.close();
return result;
}else{
return -1;
}
}
@Overridepublic String getType(Uri uri) { // TODO: Implement this to handle requests for the MIME type of the data // at the given URI. throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic Uri insert(Uri uri, ContentValues values) { //先匹配传入的uri int result = sURIMatcher.match(uri); if(result==INSERT_MATCHED){ //如果匹配的结果是 insert的话 执行insert的操作 返回结果 SQLiteDatabase db = openHelper.getReadableDatabase(); long info = db.insert("info", null, values); db.close(); //当插入一条数据的时候 数据库的内容发生了变化 可以通过内容解析者发出一个通知 ContentResolver resolver = getContext().getContentResolver(); //第一个参数 uri 通过这个uri来确定 我要通知那些内容观察者 //第二个参数 如果传入了一个内容观察者 只有这个内容观察者能够收到消息 可以传null 如果是null //只要注册了相同的uri就可以收到数据变化的消息 resolver.notifyChange(uri,null); return Uri.parse(String.valueOf(info)); }else{ //结果没有匹配 返回null; return null; }}@Overridepublic boolean onCreate() { // 当内容提供者创建的时候 会走这个方法 //在这里可以创建openHelper但是不要打开数据库 openHelper = new MyOpenHelper(getContext()); return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { int result = sURIMatcher.match(uri); if(result == QUERY_MATCHED){ SQLiteDatabase db = openHelper.getReadableDatabase(); Cursor cursor = db.query("info", projection, selection, selectionArgs, null, null, sortOrder); return cursor; }else{ throw new IllegalArgumentException("口令错误"); }}@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { if(UPDATE_MATCHED == sURIMatcher.match(uri)){ SQLiteDatabase db = openHelper.getReadableDatabase(); int result = db.update("info", values, selection, selectionArgs); db.close(); return result; }else{ return -1; }}
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- POJ2186Popular Cows(强连通分量分解模板)
- 递归思想解读
- 解决:VMWare虚拟机无法开启,显示模块“Disk”启动失败
- 如何理解 C++ 中的深拷贝和浅拷贝?
- 习题
- 内容提供者
- RabbitMQ消息队列安装及在Myeclipse下的开发实例
- PermGen space内存溢出解决
- openCV识别定位五个圆的标识物进行定位和位姿确定
- 42. Trapping Rain Water
- 微信小程序城市天气预报切换显示
- InstantRun框架源码分析之二
- LaTex数学公式
- GCD的使用小结