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 ...
随机推荐
- C#动态显示时间
private void timer1_Tick(object sender, EventArgs e) { DateTime dt = DateTime.Now; label1.Text = dt. ...
- web.xml 详细介绍(zz)
web.xml 详细介绍 博客分类: CoreJava WebXMLServletJSPTomcat http://mianhuaman.iteye.com/blog/1105522 1.启动一个W ...
- stm8 单线串口能收不能发
原因是把连接的TX和RX短接了,其实在TX和RX间要串一个电阻,然后让stm8的单线TX接到RX.
- 数的划分(NOIP2001&水题测试2017082401)
题目链接:数的划分 这题直接搜索就行了.给代码,思路没什么好讲的,要讲的放在代码后面: #include<bits/stdc++.h> using namespace std; int d ...
- Linux运维之shell脚本
一.bash漏洞 1)bash漏洞 bash漏洞是控制Linux计算机命令提示符的软件中存在的漏洞. bash是一个为GNU计划编写的Unix shell.它的名字是一系列缩写:Bourne-Agai ...
- log4j介绍和使用
1.apache推出的开源免费日志处理的类库 2.为什么需要日志?? 2.1 在项目中编写system.out.println();输出到控制台,当项目发布到tomcat后,没有控制台(在命令界面能看 ...
- php中@mysql_connect与mysql_connect有什么区别
屏蔽错误如果有错的话,会把语句都显示出来.加@就不显示$link=@mysql_connect('localhost','root','123') or die ("数据库连接失败" ...
- 证明 U and V={0}时 dim(U+V)=dim(U)+dim(V)
U And V={0} 证明 dim(U+V)=dim(U)+dim(V)设{u1,u2,...,uk} 是U的基,{v1,v2...,vr}是V的基,dim(U)=k ,dim(V)=r dim(U ...
- Typecho 官方文档 接口介绍
官方开发文档实在是太潦草了 Widget_Archive 接口 参数 描述 indexHandle $archive Widget_Archive对象 $select Typecho_Db_Query ...
- VIP之FrameBuffer
2.VIP Frame Buffer 1.原来我是一直存在一个疑惑,demo上说VIP Frame Buffer输出是固定的60fps,但是在NiosII的程序中我没有找到设置输出为60fps的设置 ...