Android---------------ContentProvider的学习
1.Uri uri = Intent.getData()------------->可以获得Uri的地址
2.Cursor cursor = getContentResolver().query(uri , null , null , null ,null); ------------->这句话相当得到空行那个位置
3.cursor.moveToFirst()------------------------------>定位到第一行
4.String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
getColumnIndex(String columnName) : 返回指定列的名称,如果不存在返回-1
总结:跨进程访问和进程间内部访问区别在于Mainfest.xml文件中的权限的问题
注意事项 : 一定在Mainfest里面注册信息
<provider android:name="MyProvider"android:authorities="cn.scu.myprovider"/>
进程内访问的一般步骤:
- 创建数据库类
- 自定义
ContentProvider
类 - 注册 创建的
ContentProvider
类--------->指的是.xml文件里面的东西 - 进程内访问
ContentProvider
的数据
UriMatcher类的作用
- 在
ContentProvider
中注册URI
- 根据
URI
匹配ContentProvider
中对应的数据表
在CotentProvider的这个类中写的
public static final String AUTOHORITY = "cn.scu.myprovider";// 设置ContentProvider的唯一标识 public static final int User_Code = 1;public static final int Job_Code = 2; // UriMatcher类使用:在ContentProvider 中注册URIprivate static final UriMatcher mMatcher;static{mMatcher = new UriMatcher(UriMatcher.NO_MATCH);// 初始化 mMatcher.addURI(AUTOHORITY,"user", User_Code);mMatcher.addURI(AUTOHORITY, "job", Job_Code);// 若URI资源路径 = content://cn.scu.myprovider/user ,则返回注册码User_Code // 若URI资源路径 = content://cn.scu.myprovider/job ,则返回注册码Job_Code}
/** * 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名 */private String getTableName(Uri uri){ String tableName = null;switch (mMatcher.match(uri)) {case User_Code: tableName = user //这个返回代表是表名break;case Job_Code: tableName = job;break; }return tableName;}
@Overridepublic Uri insert(Uri uri, ContentValues values) {// 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名 // 该方法在最下面 String table = getTableName(uri);// 向该表添加数据 db.insert(table, null, values);// 当该URI的ContentProvider数据发生变化时,通知外界(即访问该ContentProvider数据的访问者) mContext.getContentResolver().notifyChange(uri, null);// // 通过ContentUris类从URL中获取ID// long personid = ContentUris.parseId(uri);// System.out.println(personid); return uri; }
/** * 查询数据 */ @Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {// 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名 // 该方法在最下面 String table = getTableName(uri); // // 通过ContentUris类从URL中获取ID// long personid = ContentUris.parseId(uri);// System.out.println(personid); // 查询数据 return db.query(table,projection,selection,selectionArgs,null,null,sortOrder,null); }
@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { MatrixCursor matrixCursor;switch (sUriMatcher.match(uri)) {case LUCKY_MONEY_ENABLE: matrixCursor = new MatrixCursor(new String[]{TABLE_COLUMN }); matrixCursor.addRow(new Object[]{mCommonConfig.getXiaomiLuckyMoneyEnable() ? true : false });break;case LUCKY_MONEY_FAST_OPEN: matrixCursor = new MatrixCursor(new String[]{TABLE_COLUMN }); matrixCursor.addRow(new Object[]{mCommonConfig.isFastOpenEnable() ? true : false });break;case LUCKY_MONEY_FLOAT: matrixCursor = new MatrixCursor(new String[]{TABLE_COLUMN }); matrixCursor.addRow(new Object[]{mCommonConfig.isDesktopFloatWindowEnable() ? true : false });break;case LUCKY_NETWORK_LATENCY: matrixCursor = new MatrixCursor(new String[]{TABLE_COLUMN }); matrixCursor.addRow(new Object[]{mCommonConfig.getNetworkReduceLatency() ? true : false });break;case LUCKY_MONEY_HB_INFO: matrixCursor = new MatrixCursor(new String[]{"num_total","money_total","mm_money_total","qq_money_total","max_person","max_group" }); matrixCursor.addRow(new Object[]{mCommonConfig.getWarningLuckyMoneyCount(),mCommonConfig.getReceiveTotalLuckyMoney(),mCommonConfig.getMMMoney(),mCommonConfig.getQQMoney(),mCommonConfig.getPersonalLuckyMaxSource(),mCommonConfig.getLuckyMaxSource() });break;default:return null; }return matrixCursor;}
在MainActivity中写的
Uri uri_job = Uri.parse("content://cn.scu.myprovider/job");// 插入表中数据 ContentValues values2 = new ContentValues(); values2.put("_id", 3); values2.put("job", "NBA Player"); // 获取ContentResolver ContentResolver resolver2 = getContentResolver();// 通过ContentResolver 根据URI 向ContentProvider中插入数据 resolver2.insert(uri_job, values2); // 通过ContentResolver 向ContentProvider中查询数据 Cursor cursor2 = resolver2.query(uri_job, new String[]{"_id", "job"}, null, null, null);while (cursor2.moveToNext()) {//System.out.println("query job:" + cursor2.getInt(0) + " " + cursor2.getString(1)); // 将表中数据全部输出 Log.i("ceshi", "int ===" + cursor2.getInt(0)); Log.i("ceshi", "String ===" + cursor2.getString(1)); } cursor2.close();// 关闭游标} Url url = Url.parse("content://cn.scu.myprovider/job");ContentValues value = new ContentValues();value.put(-_id , 3);vlaue.put(name , "lisan");ContentResolver resolver = getContentResolver();resolver.insert(url,value); --------------------------------->它实际调用的是ContentProvider里面写的那个insert()函数 Cursor cursor = resolver.query(url , null , null ,null , null);------>它实际调用的是ContentProvider里面写的那个query那个函数while(cursor.moveToNext){ }cursor.close() -------->一定关闭游标卡尺 ContentObserver类 定义:内容观察者 作用:观察 Uri引起 ContentProvider 中的数据变化 & 通知外界(即访问该数据访问者) 当ContentProvider 中的数据发生变化(增、删 & 改)时,就会触发该 ContentObserver类 具体使用// 步骤1:注册内容观察者ContentObserver getContentResolver().registerContentObserver(uri);-------->注册监听器 // 通过ContentResolver类进行注册,并指定需要观察的URI // 步骤2:当该URI的ContentProvider数据发生变化时,通知外界(即访问该ContentProvider数据的访问者) public class UserContentProvider extends ContentProvider { public Uri insert(Uri uri, ContentValues values) { db.insert("user", "userid", values); getContext().getContentResolver().notifyChange(uri, null); // 通知访问者 } } // 步骤3:解除观察者 getContentResolver().unregisterContentObserver(uri); // 同样需要通过ContentResolver类进行解除 //注册ContentProvider的观察者this.getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new SmsObserver(new Handler()));
//根据自定义的ContentObserver监听类 private final class SmsObserver extends ContentObserver { public SmsObserver(Handler handler) { super(handler); } public void onChange(boolean selfChange) { //这里面就是接受notifyChange的改变做相应的处理 getContext().getContentResolver().notifyChange(uri, null); } }
进程间进行数据共享
1. 创建数据库类
2. 自定义 ContentProvider
类
3. 注册 创建的 ContentProvider
类
进程1的AndroidManifest.xml的文件
<provider android:name="MyProvider"
android:authorities="scut.carson_ho.myprovider"
// 声明外界进程可访问该Provider的权限(读 & 写)
android:permission="scut.carson_ho.PROVIDER"
// 权限可细分为读 & 写的权限
// 外界需要声明同样的读 & 写的权限才可进行相应操作,否则会报错
//android:readPermisson = "scut.carson_ho.Read"
// android:writePermisson = "scut.carson_ho.Write"
// 设置此provider是否可以被其他进程使用
android:exported="true" />
进程2的AndroidManifest.xml的文件
// 声明本应用可允许通信的权限(全权限)
<uses-permission android:name="scut.carson_ho.PROVIDER"/>
// 细分读 & 写权限如下,但本Demo直接采用全权限
//<uses-permission android:name="scut.carson_ho.Read"/>
/// <uses-permission android:name="scut.carson_ho.Write"/>
// 注:声明的权限必须与进程1中设置的权限对应
转载于:https://www.cnblogs.com/liunx1109/p/9985964.html
Android---------------ContentProvider的学习相关推荐
- Android基础知识点学习总结
Android基础知识点学习总结 安卓基础知识个人学习笔记分享~ 一.Android系统架构 Linux内核层→系统运行层→应用框架层→应用层 1.Linux内核层:Android系统是基于Linux ...
- 基于 Android NDK 的学习之旅-----资源释放
基于 Android NDK 的学习之旅-----资源释放 做上一个项目的时候因为与C引擎交互频繁,有时候会突然莫名其妙的的整个应用程序直接挂掉.因为我是学Java 开始的,所以对主动释放内存没多大概 ...
- 基于 Android NDK 的学习之旅----- C调用Java
2019独角兽企业重金招聘Python工程师标准>>> 基于 Android NDK 的学习之旅----- C调用Java 许多成熟的C引擎要移植到Android 平台上使用 , 一 ...
- 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码)
基于 Android NDK 的学习之旅-----数据传输(引用数据类型) 接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1. String ...
- 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)
原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...
- Android ContentProvider支持跨进程数据共享与互斥、同步 杂谈
在开发中,假如,A.B进程有部分信息需要同步,这个时候怎么处理呢?设想这么一个场景,有个业务复杂的Activity非常占用内存,并引发OOM,所以,想要把这个Activity放到单独进程,以保证OOM ...
- 基于android的交流平台,基于Android的移动学习交流平台的设计与实现
摘要: 随着移动互联网技术的不断发展,智能手机的不断普及,现在越来越多的人通过手机等智能设备来进行学习和交流.为了满足教师和学生实时的沟通交流,提高学生的学习兴趣和效率,本文设计了基于Android的 ...
- Android基础知识学习
一.Android编译过程 初始化参数设置 检查环境变量与目标环境 选择lunch并读取目标配置和平台信息 清空输出目录 编译 生成升级包 二. ./build/envsetup.sh分析 加载编译命 ...
- 基于 Android NDK 的学习之旅-----Java 调用C(附源码)
基于 Android NDK 的学习之旅-----Java 调用C 随便谈谈为什么要Java调用C 吧: 我认为: 1. 有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所 ...
- Android 渗透测试学习手册 翻译完成!
Android 渗透测试学习手册 中文版 原书:Learning Pentesting for Android Devices 译者:飞龙 在线阅读 PDF格式 EPUB格式 MOBI格式 代码仓库 ...
最新文章
- 极小连通子图和极大连通子图_强连通分量与拓扑排序
- 神爱程序员,于是带来Python
- python del函数_干货:Python的内存管理办法
- 【跃迁之路】【497天】程序员高效学习方法论探索系列(实验阶段254-2018.06.17)...
- 电气论文实现:通过电力光伏负荷预测讲解seq2seq翻译模型
- mysql之触发器trigger
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1010:计算分数的浮点数值
- excel中如何取消自动超链接?
- OpenGL中的几何体实例化(OpenGL Geometry Instancing)
- IIS 启动不了(服务没有及时响应启动或控制请求)解决
- Exception in thread main com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport e
- 男子吐槽:为什么那么多人不喜欢996,非要年纪轻轻进国企养老
- matlab fopen wt,matlab的fopen和fprintf
- html中引入调用另一个公用html模板文件的方法
- ERP项目实施记录05
- 拿下上市企业offer月薪17.5K!岁月不会亏待每一个用力奔跑的人
- 天刀服务器维护时间表,3月2日服务器例行维护公告
- 本地代码上传github
- 应届生学弟苦恼:是去华为拿1万多低薪,还是去互联网自研公司拿2万多高薪?
- JEPG图像存储结构