Android复习练习十五(使用contentresolver查询和添加联系人)

使用contentresolver查询和添加联系人


需求:写一个应用,有两个按键,分别用来查询所有联系人和添加联系人到系统通讯录。


这里跟上一个练习差不多,基本还是利用系统的provider来做,这里记录一下查看系统provider的Uri的方法,就拿这里这个通讯录的provider来说吧:

一、在Android中查找系统内容提供者对应的Uri的方法:

1、先将Android源码目录\packages\providers\ContactsProvider目录使用新建一个已存在的安卓工程的方式导入到eclipse中


2、首先去源码中找到  Android源码目录\packages\providers\ContactsProvider\AndroidManifest.xml文件,打开,我们这里想看看联系人的provider是写在哪里的,实际上每个provider都不需要在清单文件中注册,我们只需要在清单文件里浏览标签名即可,这样会比直接去找要方便清晰。我们可以发现其中包含一个provider:

provider android:name="ContactsProvider2"


3、这时候如果我们无法直接通过ctrl+左键单击直接进入这个文件,那么我们可以点中导入的工程,然后按ctrl+H,在filesearch中搜索ContactsProvider2,我们会发现在src下有一个ContactsProvider2的文件,我们打开就可以看到ContactsProvider2

4、找到ContactsProvider2类之后,我们可以按ctrl+o然后输入一个 '{' 号,会发现eclipse给出了提示,搜索到两个大括号组合,我们查看之后发现第二个大括号是我们需要查找的。为什么要搜索大括号呢?因为内容提供者的Uri初始化一般都放在static{}块中进行,所以搜索{}可以比较快的发现我们要找的

5、在第二个块里面,我们可以找到:

matcher.addURI(ContactsContract.AUTHORITY, "contacts", CONTACTS);

显然 ContactsContract.AUTHORITY 是主机名 ,contacts 是分机号。通过查找ContactsContract类,我们可以发现它有一个成员变量AUTHORITY="com.android.contacts",于是,我们拿到了系统联系人内容提供者的Uri为:content://com.android.contacts/contacts

二、系统联系人数据库的结构:

这里的相对就比较简单了,一般是获得系统的contentresolver类的对象,然后使用该对象和对应的Uri对相应的数据库进行增删查改等操作。由于我们这里要修改是系统联系人,所以我们需要对系统联系人数据库的结构有一些了解:
我们需要关注的表有两个:

1、raw_contacts表

Android复习练习十五(使用contentresolver查询和添加联系人)_第1张图片

2、data表
Android复习练习十五(使用contentresolver查询和添加联系人)_第2张图片

raw_contacts表中实际上没有什么需要关注的数据,只有一个就是联系人的_id号,这个_id号是跟每一个联系人一一对应的,然后这个_id号会对应到data表中的raw_contact_id;通过观察我们不难发现,每一个raw_contact_id对应了三条联系人的数据,分别是号码、邮箱和姓名;然后还有一点需要关注的就是mimetype_id,这个列实际上应该叫mimetype,这里是通过多表查询方法来转换成两个属性的,我们到mimetypes表中可以发现对应数字的类型:
Android复习练习十五(使用contentresolver查询和添加联系人)_第3张图片
于是我们后面用到查询和添加时判断数据是什么类型就可以直接使用mimetype为上面表的什么值来判断而不能用mimetype_id来判断了。


三、具体实现:

具体实现就相对比较简单了,基本思路就是:

对于查询而言:通过contentresolver对象来对数据库进行查找,这里需要注意的是,我们先需要在raw_contacts表中拿到_id值,然后使用_id值去data表中找出raw_contact_id与_id相同的所有数据,因为这些数据都属于同一个联系人,然后我们遍历所有的_id,就完成了所有数据的查询。

对于插入联系人而言:与上面基本相同,只是要注意的是,也是先在raw_contacts中插入一个新的_id,一般我们选最大已经存在的_id然后再加上1即可,然后再将这个对应的_id插入到data中,同时插入对应mimetype和data1数据,同样将所有的不同类型的mimetype和对应的data1数据插入完成,就完成了一个联系人的插入。

插入完成之后,我们可以直接在系统联系人应用中看到我们插入的联系人及相关信息。

Activity代码:


package com.alexchen.queryandaddcontact;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends Activity {

private static final String HOST = "content://com.android.contacts/";
private String email;
private String name;
private String address;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

private void printCursor(Cursor cursor) {
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
// 行号
// int position = cursor.getPosition();


int columnCount = cursor.getColumnCount();
// 取出列的名字
for (int i = 0; i < columnCount; i++) {
System.out.print("第" + cursor.getPosition() + "行的" + "第"
+ i + "列名:" + cursor.getColumnName(i) + ";");
System.out.println("值为:" + cursor.getString(i));

}
}
cursor.close();
}
}

/**
* 查询联系人

* @param view
*/
public void queryContacts(View view) {
// 1.去raw_contacts表中取出所有联系人的_id
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(Uri.parse(HOST + "raw_contacts"),
new String[] { "_id" }, null, null, null);
// printCursor(cursor);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
int _id = cursor.getInt(0);
String selection = "raw_contact_id=?";
String[] selectionArgs = new String[] { String.valueOf(_id) };
// 2.去data表中根据上面取到的_id查询对应id的数据

// 这里resolver要重新获取,因为是不同的cursor
Cursor cursor2 = getContentResolver().query(
Uri.parse(HOST + "data"),
new String[] { "data1", "mimetype" }, selection,
selectionArgs, null);
// printCursor(cursor2);
if (cursor2 != null && cursor2.getCount() > 0) {
while (cursor2.moveToNext()) {
String mimetype = cursor2.getString(1);

// mimetype;值为:vnd.android.cursor.item/phone_v2
if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
address = cursor2.getString(0);
System.out.println("address=" + address);

// mimetype;值为:vnd.android.cursor.item/name
} else if ("vnd.android.cursor.item/name"
.equals(mimetype)) {
name = cursor2.getString(0);
System.out.println("name=" + name);


// mimetype;值为:vnd.android.cursor.item/email_v2
} else if ("vnd.android.cursor.item/email_v2"
.equals(mimetype)) {
email = cursor2.getString(0);
System.out.println("email=" + email);
}
}
cursor2.close();
}


}
cursor.close();
}
}
/**
* 插入联系人

* @param view
*/
public void addContacts(View view) {
int _id;
// 1.找到raw_contacts表最大的_id
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(Uri.parse(HOST + "raw_contacts"),
new String[] { "_id" }, null, null, "_id desc limit 1");

if (cursor != null && cursor.moveToFirst()) {
_id = cursor.getInt(0);
_id += 1;
System.out.println(_id);

// 2.去raw_contacts表中添加新的id
ContentValues values = new ContentValues();
values.put("_id", _id);
getContentResolver().insert(Uri.parse(HOST + "raw_contacts"),
values);


// 3.根据添加的记录的id值,去data表中对应位置添加三条数据记录
// 存号码

values = new ContentValues();
values.put("raw_contact_id", _id);
values.put("mimetype", "vnd.android.cursor.item/phone_v2");
values.put("data1", "10086");
getContentResolver().insert(Uri.parse(HOST + "data"), values);

// 存姓名
values = new ContentValues();
values.put("raw_contact_id", _id);
values.put("mimetype", "vnd.android.cursor.item/name");
values.put("data1", "中国移动");
getContentResolver().insert(Uri.parse(HOST + "raw_contacts"),
values);


values = new ContentValues();
values.put("raw_contact_id", _id);
values.put("mimetype", "vnd.android.cursor.item/email_v2");
values.put("data1", "[email protected]");
getContentResolver().insert(Uri.parse(HOST + "data"), values);

}
}
}















你可能感兴趣的:(Android)