您的位置:首页 > 移动开发 > Android开发

android之数据存储3

2016-08-18 21:19 183 查看
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);

---------------------------------------------------------------------<
cde2
/div>

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部分
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息