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"/>

进程内访问的一般步骤:

  1. 创建数据库类
  2. 自定义 ContentProvider
  3. 注册 创建的 ContentProvider类--------->指的是.xml文件里面的东西
  4. 进程内访问 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的学习相关推荐

  1. Android基础知识点学习总结

    Android基础知识点学习总结 安卓基础知识个人学习笔记分享~ 一.Android系统架构 Linux内核层→系统运行层→应用框架层→应用层 1.Linux内核层:Android系统是基于Linux ...

  2. 基于 Android NDK 的学习之旅-----资源释放

    基于 Android NDK 的学习之旅-----资源释放 做上一个项目的时候因为与C引擎交互频繁,有时候会突然莫名其妙的的整个应用程序直接挂掉.因为我是学Java 开始的,所以对主动释放内存没多大概 ...

  3. 基于 Android NDK 的学习之旅----- C调用Java

    2019独角兽企业重金招聘Python工程师标准>>> 基于 Android NDK 的学习之旅----- C调用Java 许多成熟的C引擎要移植到Android 平台上使用 , 一 ...

  4. 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码)

    基于 Android NDK 的学习之旅-----数据传输(引用数据类型) 接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1.  String ...

  5. 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

    原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...

  6. Android ContentProvider支持跨进程数据共享与互斥、同步 杂谈

    在开发中,假如,A.B进程有部分信息需要同步,这个时候怎么处理呢?设想这么一个场景,有个业务复杂的Activity非常占用内存,并引发OOM,所以,想要把这个Activity放到单独进程,以保证OOM ...

  7. 基于android的交流平台,基于Android的移动学习交流平台的设计与实现

    摘要: 随着移动互联网技术的不断发展,智能手机的不断普及,现在越来越多的人通过手机等智能设备来进行学习和交流.为了满足教师和学生实时的沟通交流,提高学生的学习兴趣和效率,本文设计了基于Android的 ...

  8. Android基础知识学习

    一.Android编译过程 初始化参数设置 检查环境变量与目标环境 选择lunch并读取目标配置和平台信息 清空输出目录 编译 生成升级包 二. ./build/envsetup.sh分析 加载编译命 ...

  9. 基于 Android NDK 的学习之旅-----Java 调用C(附源码)

    基于 Android NDK 的学习之旅-----Java 调用C 随便谈谈为什么要Java调用C 吧: 我认为: 1.  有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所 ...

  10. Android 渗透测试学习手册 翻译完成!

    Android 渗透测试学习手册 中文版 原书:Learning Pentesting for Android Devices 译者:飞龙 在线阅读 PDF格式 EPUB格式 MOBI格式 代码仓库 ...

最新文章

  1. 极小连通子图和极大连通子图_强连通分量与拓扑排序
  2. 神爱程序员,于是带来Python
  3. python del函数_干货:Python的内存管理办法
  4. 【跃迁之路】【497天】程序员高效学习方法论探索系列(实验阶段254-2018.06.17)...
  5. 电气论文实现:通过电力光伏负荷预测讲解seq2seq翻译模型
  6. mysql之触发器trigger
  7. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1010:计算分数的浮点数值
  8. excel中如何取消自动超链接?
  9. OpenGL中的几何体实例化(OpenGL Geometry Instancing)
  10. IIS 启动不了(服务没有及时响应启动或控制请求)解决
  11. Exception in thread main com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport e
  12. 男子吐槽:为什么那么多人不喜欢996,非要年纪轻轻进国企养老
  13. matlab fopen wt,matlab的fopen和fprintf
  14. html中引入调用另一个公用html模板文件的方法
  15. ERP项目实施记录05
  16. 拿下上市企业offer月薪17.5K!岁月不会亏待每一个用力奔跑的人
  17. 天刀服务器维护时间表,3月2日服务器例行维护公告
  18. 本地代码上传github
  19. 应届生学弟苦恼:是去华为拿1万多低薪,还是去互联网自研公司拿2万多高薪?
  20. JEPG图像存储结构

热门文章

  1. xampp 2016支持php7.0,xampp 装php7
  2. 实验三lr1分析法java_第十讲 频域分析法(Nyquist曲线)
  3. Mad Libs 游戏
  4. 关闭tomcat8080端口
  5. OC---Math公式
  6. Java 异常处理 之 运行期异常
  7. 非常使用的mongodb的聚合函数(使用SpringDataMongoDb)
  8. CentOS7 配置免密登陆
  9. BZOJ2038:[2009国家集训队]小Z的袜子——题解
  10. 通过Keepalived实现Redis Failover自动故障切换