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 中注册URI
private 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;
}
@Override
public 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;
}
/**
* 查询数据
*/
@Override
public 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);
}
@Override
public 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中设置的权限对应
Android---------------ContentProvider的学习的更多相关文章
- Android ContentProvider 简单学习
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.以前我们学习过文件的操作模式,通过指定文件的操作模式为Context.MODE_WORL ...
- 一、Android四大框架之ContentProvider的学习与运用,实现SQLite的增删改查。
本文系原创博客,文中不妥烦请指出,如需转载摘要请注明出处! ContentProvider的学习与运用 Alpha Dog 2016-04-13 10:27:06 首先,项目的地址:https:// ...
- Android基础 : Android ContentProvider
Android 应用程序通过ContentProvider实现方式统一的数据共享功能. 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activi ...
- android NDK 实用学习(五)-c++端调用java接口
1,阅读此文章前请阅读前面文章,以免阅读出现障碍: android NDK 实用学习(一)-获取java端类及其类变量 android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值 ...
- android NDK 实用学习(三)- java端类对象的构造及使用
1,读此文章前我假设你已经读过: android NDK 实用学习-获取java端类及其类变量 android NDK 实用学习-java端对象成员赋值和获取对象成员值 2,java端类对象的构造: ...
- android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值
1,关于java端类及接口定义请参考: android NDK 实用学习-获取java端类及其类变量 2,对传过来的参数进行赋值: 对bool类型成员进行赋值 env->SetBooleanF ...
- Android源码学习之装饰模式应用
首先得了解最基础的装饰器模式 参考 设计模式之八 --- 装饰模式(Decorator) 参考链接:http://blog.csdn.net/cjjky/article/details/7478788 ...
- Android应用开发学习之表格视图
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 本文我们来学习一个使用表格视图的程序,下图是该程序的运行效果: 该程序主Activity文件内容如下: packag ...
- 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)
原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...
- Android ContentProvider完整案例
ContentData类,提供数据常量: /** * 提供ContentProvider对外的各种常量,当外部数据需要访问的时候,就可以参考这些常量操作数据. * @author HB * */ pu ...
随机推荐
- 通过 Spring Security配置 解决X-Frame-Options deny 造成的页面空白 iframe调用问题
spring Security下,X-Frame-Options默认为DENY,非Spring Security环境下,X-Frame-Options的默认大多也是DENY,这种情况下,浏览器拒绝当前 ...
- Tomcat新问题 还没有解决:the apr based apache tomcat native librariy which allows optional perf...........
问题信息详细: 2012-5-18 18:41:54 org.apache.catalina.core.AprLifecycleListener init 信息: The APR based Apa ...
- python之Flask框架
一.简单的Flask框架 1)flask简介 Flask 是一个 web 框架.也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序. 这个 wdb 应用程序可以使一些 we ...
- 粒子跟随本体unity
Simulation Space(模拟空间):在世界坐标和本地坐标中切换,这个就是制作技能痕迹的重要位置,新建的粒子系统一般都默认为local,所以在粒子本体移动的时候也跟着进行移动,改为world的 ...
- markdown中自己偶尔需要的小技巧
慢慢积累,需要时搜索,并记录与此. 1.写文章时,由于markdown不负责首行缩进,所以“空格”需要特殊的方法去实现,最简单方便的是--输入全角空格(切换全角输入,点空格) 2.markdown中注 ...
- MVC 开发模式
1.M:Model 模型:实体类和业务和dao 2.V:view 视图:JSP 3.C:Controller 控制器:servlet 3.1 作用:视图和逻辑分离 4.MVC适用场景:大型项目开 ...
- Our Future
The world is betting on how to win the football game: But I'm betting on how to win your heart: Mayb ...
- 2018.10.30 NOIP模拟 排列树(树形dp+组合数学)
传送门 考试的时候乱搞过了. 其实题目就是让你求拓扑排序方案数. 直接树形dpdpdp然后组合数转移一下就行了. 乱搞代码
- TCP粘包问题分析和解决(全)
TCP通信粘包问题分析和解决(全) 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送 ...
- 5.Vue临时上传文件夹
1.在项目目录中,通过npm install multiparty进行安装必要组件npm install multiparty --save-dev 2.app.js中添加app.use(bodyPa ...