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 ...
随机推荐
- Notepad++ tab替换为4个空格
- canvas 实现弹跳效果
一:创建画布 <canvas width="600" height="600" id="canvas"></canvas& ...
- git .gitignore未生效
添加进.gitignore的问题未生效. .gitignore只会忽略在.gitignore编写之后的未跟踪(untrack)文件,而在编写.gitignore之前已经add and commit的文 ...
- 2018.11.07 NOIP模拟 异或(数位dp)
传送门 对于每个二进制位单独考虑贡献. 然后对于两种情况分别统计. 对于第二种要用类似数位dpdpdp的方法来计算贡献. 代码
- 使用express框架和mongoose在MongoDB更新数据
update方法 modelName.update({需要替换的内容},{“$set”:{新的内容}},function(err,doc){}); User.update({userName:&qu ...
- 利用xshell远程连接centos安装oracle11g时在图形界面登录
1.首先给centos安装桌面环境.( yum groupinstall ‘GNOME Desktop’) 2.安装Xmanager软件 3.打开xshell,新建连接 填好主机和名称后,点击左侧连接 ...
- SQL中的split方法的使用
参数说明: 1.@String :需要split的字符串 2.@Delimiter :格式化时分隔符 3.@index :返回split后数组的值 ), ),)) ) AS BEGIN )) ) DE ...
- maven的传递性依赖
一.概念: 假如有maven项目A,项目A依赖项目B,项目B依赖项目C,我们说A对B是第一直接依赖,B对C是第二直接依赖,那么他们的依赖关系:A---->B----->C,那么我们执行项目 ...
- BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2321 Solved: 1187[Submit][Status ...
- 工作总结(二):Web Design
PHP框架:CakePHP 前端框架:Bootstrap Payment Data Transfer:https://developer.paypal.com/docs/classic/paypal- ...