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 ...
随机推荐
- 安装配置nfs
#yum -y install nfs-utils rpcbind #service rpcbind start#service nfs start #chkconfig --add rpcbind# ...
- Mysql 常用增删改查命令集合教程
创建:create 插入:insert 更新:update 查询:select 删除:delete 修改:alter 销毁:drop 创建一个数据库: create databas ...
- 2019.01.01 bzoj3625:小朋友和二叉树(生成函数+多项式求逆+多项式开方)
传送门 codeforces传送门codeforces传送门codeforces传送门 生成函数好题. 卡场差评至今未过 题意简述:nnn个点的二叉树,每个点的权值KaTeX parse error: ...
- 负载均衡下 tomcat session 共享
概述 在分布式部署的情况下,每台tomcat 都会有自己的session ,这样如果 用户A 在tomcat1 下登录,在tomcat2 下并没有session信息.如果 tomcat1宕机,tomc ...
- Codeforces Round #538 (Div. 2) E 随机数生成
https://codeforces.com/contest/1114/problem/E 题意 交互题,需要去猜一个乱序的等差数列的首项和公差,你能问两种问题 1. 数列中有没有数比x大 2. 数列 ...
- 菜品识别 API调用
#get_access_token.py #获取access_token 1 import requests def GetToken(API_KEY,SECRET_KEY): url = 'http ...
- Latex插图操作
1.竖排插入两张图 \begin{figure}[h] //放在当前位置 \centering \subfigure[A given traffic flow set]{ \includegraphi ...
- Oracle数据库使用mybatis的时候,实体类日期为Date类型,mybatis里面定义的是Date类型,插入的时候,时分秒全部是12:00:00问题
实体类中日期定义的是Date类型的,没毛病: 我在mybatis里面定义的是Date类型的,进行测试的时候发现,数据库插入的日期的时分秒全部都是一样的,都是12:00:00,很郁闷: 后来把mybat ...
- 理解-const
c++ 中const和c中define的区别 (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不 ...
- 如何批量下载网站中的超链接(一次性下载网页中所有可能的PDF文件)
最近公司在做工程项目,实现文件批量下载. 网上找了很久,发现网上的代码都有相似的问题,不过最终还是让我找到了一个符合的项目. 工程: 进行项目文件下载功能分析,弄清楚文件批量下载的原理,提供的数据支持 ...