android之数据存储3





Content Provider

定义:提供了我们在应用程序之间共享数据的一种机制(Sqlite数据库)

程序实现通讯原理:
甲方提供一个数据库暴露出来给别人使用(ContentProvider),乙方就可以通过 ContentResolver这个类去操作甲方的数据库(对甲方的数据库进行增删改查)

读取写入自带联系人通讯录所需的权限:
<!-- 写权限 -->
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<!-- 读权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />



注意:如果在模拟器上进行联系人操作, 然后可以在file explorer查看
data/data/目录下面的/com.providers.contacts下面的 contacts2.db数据库里( 没有进行操作之前是查看不到的 )



(1)查询联系人的信息
1.获得ContentResolver对象
ContentResolver contentResolver = getContentResolver();
获得Uri对象
private String uri_contacts_data = "content://com.android.contacts/data";
private String uri_contacts_phones = "content://com.android.contacts/data/phones";

2.Uri uri = Uri.parse(uri_contacts_data);


3.调用提供的query方法(返回的是联系人id和名字)调用提供的query方法(返回的是联系人id和名字)
// 要查询指定的字段,需要同时查询“_id”字段,否则会报错,“display_name”这个字段表示联系人的姓名
Cursor cursor = resolver.query(uri, new String[] { "_id","display_name" }, null, null, null);
4.再次调用提供的query方法--用上次返回的id作为参数,取得联系人号码
query(uri, projection, selection, selectionArgs, sortOrder)

"raw_contact_id = ?"
在"raw_contacts"表中查到的_id字段和“data”表中查到的“raw_contact_id”是一一对应的,所以可以根据“raw_contact_id”这个字段在“data”表中去查询“data1”

data1和data2
data1属性存放总数据;
data2属性:
-如果此记录存放姓名,则data2存放名;
-如果此记录存放电话,则data2存放类型,比如手机、家电;
-如果此记录存放组织,则data2存放类型,比如公司、其他;
-如果此记录存放地址,则data2存放类型,比如住宅,单位等;


//遍历查询出来的用户名
while (cursor.moveToNext()) {
Log.e("bm", "_id: " + cursor.getString(0) + "display_name: "
+ cursor.getString(1));
Cursor cursor_phone = resolver.query(
Uri.parse(uri_contacts_phones), new String[] { "data1" },
"raw_contact_id=?",
new String[] { cursor.getString(0) + "" }, null);
while (cursor_phone.moveToNext()) {
Log.e("bm", cursor_phone.getString(0));
}
//读完游标里面的数据,需要关闭游标
cursor_phone.close();
}
//读完游标里面的数据,需要关闭游标
cursor.close();


(2)查询指定联系人:
"content://com.android.contacts/data/phones/filter/" + number
代码示例:

//定义要查询的电话号码
String number="180**********";
//去联系人表中要查询的地址
String str="content://com.android.contacts/data/phones/filter/" + number;
ContentResolver resolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//得到contentResolver对象
resolver=getContentResolver();
Uri uri=Uri.parse(str);
Cursor cursor=resolver.query(uri, new String[]{"display_name"}, null, null, null);
if (cursor.moveToFirst()) {
Log.e("bm", "姓名:"+cursor.getString(0));
}
cursor.close();
}



ContentProvider进程间通讯(Sqlite数据库)
1.所要操作的数据库所在程序:
自定义一个MyProvider类
1.定义一个类继承ContentProvider
2.重写里面的方法 -->自动重写( 需要定义一个Uri匹配器来匹配Uri)
需要进行哪些操作就去对应的方法里面
在onCreate()方法里(类生成时就执行)

代码示例:
MySqlUtils utils;
UriMatcher matcher;
//得到工具类对象-->上下文对象getContext()
utils =new MySqlUtils(getContext());
//得到matcher匹配器对象
matcher=new UriMatcher(UriMatcher.NO_MATCH);
//添加girl表的URi
matcher.addURI(authorities, table_name, code);
//添加boy表的uri
matcher.addURI("com.xx.content", "boy", 2);
query()方法//用来查询
insert()方法//用来插入数据
@Override
public Uri insert(Uri uri, ContentValues values) {
switch (matcher.match(uri)) {
case 1://添加数据到girl表
utils.addGirl(values);
break;
case 2://添加数据到boy表
utils.addBoy(values);
break;
default:
break;
}
return null;
}
delete()方法//用来删除数据
update()放法//用来修改数据

3.在清单文件里面进行注册
<!-- 注册ContentProvider
(1)name="包名.类名"
(2) authorities = "com.公司名.项目名"
(3)exported="true" 在安卓4.2之后必须设置这个属性-->

2.客户端使用ContentResolver操作ContentProvider中的数据
I.获取ContentResolver 对象
II.获取Uri
III.使用ContentValues来装数据
IV.用ContentResolver操作ContentValues


代码示例:
setContentView(R.layout.activity_main);
//1.得到ContentResolver对象
ContentResolver resolver=getContentResolver();
//2.得到URi对象
//content://甲方在清单文件里面注册的授权/表名
Uri uri=Uri.parse("content://com.xx.content/girl");
//3.实例化一个Contentvalues对象
ContentValues values=new ContentValues();
values.put("_id", 1);
values.put("name", "小明");
values.put("age",21);
//4.插入该数据到甲方的数据库中去
resolver.insert(uri, values);

---------------------------------------------------------------------

Uri
Uri概念粗解:
Uri是指通用资源标志符

例子:content://com.example.Mycontentproviderdemo/employee/1
A:前缀表明数据受控于一个内容提供者。它从不修改,也就是schema
B:是指在AndroidMainfest.xml中我们注册的provider中的android:authorities属性所对应
C:具体操作于哪个条目
D:具体指定到哪个条目下的哪条记录

经常需要解析Uri,并从Uri中获取数据。
Android系统提供了两个用于操作Uri的工具类
UriMatcher()用来匹配Uri。

使用方法步骤:

1.初始化
UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);// UriMatcher.NO_MATCH 表示不匹配任何路径的返回码

2.注册需要的Uri
sMatcher.addURI(“com.jiahui.provider.myprovider”, “person”, 1);
sMatcher.addURI(“com.jiahui.provider.myprovider”, “person/#”, 2);//#号为通配符
sMatcher.addURI(“com.jiahui.provider.myprovider”, “person/*”, 3);//* 号为任意字符

3.与已经注册的Uri进行匹配

sMatcher.match(uri)



ContentUris它用于在Uri后面追加一个ID或者解析出传入的Uri所带上的ID值
使用:
withAppendedId (Uri contentUri, long id)---用于为路径加上ID部分
parseId (Uri contentUri)----从路径中获取ID部分
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值