本文仅做我本人的学习笔记 以防自己找不到几位前辈的写的资料 想看原文的可以点击本文链接
原博客地址这里
1.查找、增加、删除、修改联系人
直接贴代码:
ContactsManager.java
-
package com.example.siqi.contacts;
-
-
import java.util.ArrayList;
-
-
import android.content.ContentProviderOperation;
-
import android.content.ContentResolver;
-
import android.database.Cursor;
-
import android.provider.ContactsContract;
-
import android.util.Log;
-
-
public
class ContactsManager {
-
-
private ContentResolver contentResolver;
-
private
static
final String TAG =
"ContactsManager";
-
-
/**
-
* Use a simple string represents the long.
-
*/
-
private
static
final String COLUMN_CONTACT_ID =
-
ContactsContract.Data.CONTACT_ID;
-
private
static
final String COLUMN_RAW_CONTACT_ID =
-
ContactsContract.Data.RAW_CONTACT_ID;
-
private
static
final String COLUMN_MIMETYPE =
-
ContactsContract.Data.MIMETYPE;
-
private
static
final String COLUMN_NAME =
-
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME;
-
private
static
final String COLUMN_NUMBER =
-
ContactsContract.CommonDataKinds.Phone.NUMBER;
-
private
static
final String COLUMN_NUMBER_TYPE =
-
ContactsContract.CommonDataKinds.Phone.TYPE;
-
private
static
final String COLUMN_EMAIL =
-
ContactsContract.CommonDataKinds.Email.DATA;
-
private
static
final String COLUMN_EMAIL_TYPE =
-
ContactsContract.CommonDataKinds.Email.TYPE;
-
private
static
final String MIMETYPE_STRING_NAME =
-
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE;
-
private
static
final String MIMETYPE_STRING_PHONE =
-
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE;
-
private
static
final String MIMETYPE_STRING_EMAIL =
-
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE;
-
-
public ContactsManager(ContentResolver contentResolver) {
-
this.contentResolver = contentResolver;
-
}
-
-
/**
-
* Search and fill the contact information by the contact name given.
-
* @param contact Only the name is necessary.
-
*/
-
public Contact searchContact(String name) {
-
Log.w(TAG,
"**search start**");
-
Contact contact =
new Contact();
-
contact.setName(name);
-
Log.d(TAG,
"search name: " + contact.getName());
-
String id = getContactID(contact.getName());
-
contact.setId(id);
-
-
if(id.equals(
"0")) {
-
Log.d(TAG, contact.getName() +
" not exist. exit.");
-
}
else {
-
Log.d(TAG,
"find id: " + id);
-
//Fetch Phone Number
-
Cursor cursor = contentResolver.query(
-
android.provider.ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
-
new String[]{COLUMN_NUMBER, COLUMN_NUMBER_TYPE},
-
COLUMN_CONTACT_ID +
"='" + id +
"'",
null,
null);
-
while(cursor.moveToNext()) {
-
contact.setNumber(cursor.getString(cursor.getColumnIndex(COLUMN_NUMBER)));
-
contact.setNumberType(cursor.getString(cursor.getColumnIndex(COLUMN_NUMBER_TYPE)));
-
Log.d(TAG,
"find number: " + contact.getNumber());
-
Log.d(TAG,
"find numberType: " + contact.getNumberType());
-
}
-
//cursor.close();
-
-
//Fetch email
-
cursor = contentResolver.query(
-
android.provider.ContactsContract.CommonDataKinds.Email.CONTENT_URI,
-
new String[]{COLUMN_EMAIL, COLUMN_EMAIL_TYPE},
-
COLUMN_CONTACT_ID +
"='" + id +
"'",
null,
null);
-
while(cursor.moveToNext()) {
-
contact.setEmail(cursor.getString(cursor.getColumnIndex(COLUMN_EMAIL)));
-
contact.setEmailType(cursor.getString(cursor.getColumnIndex(COLUMN_EMAIL_TYPE)));
-
Log.d(TAG,
"find email: " + contact.getEmail());
-
Log.d(TAG,
"find emailType: " + contact.getEmailType());
-
}
-
cursor.close();
-
}
-
Log.w(TAG,
"**search end**");
-
return contact;
-
}
-
-
/**
-
*
-
* @param contact The contact who you get the id from. The name of
-
* the contact should be set.
-
* @return 0 if contact not exist in contacts list. Otherwise return
-
* the id of the contact.
-
*/
-
public String getContactID(String name) {
-
String id =
"0";
-
Cursor cursor = contentResolver.query(
-
android.provider.ContactsContract.Contacts.CONTENT_URI,
-
new String[]{android.provider.ContactsContract.Contacts._ID},
-
android.provider.ContactsContract.Contacts.DISPLAY_NAME +
-
"='" + name +
"'",
null,
null);
-
if(cursor.moveToNext()) {
-
id = cursor.getString(cursor.getColumnIndex(
-
android.provider.ContactsContract.Contacts._ID));
-
}
-
return id;
-
}
-
-
/**
-
* You must specify the contact's ID.
-
* @param contact
-
* @throws Exception The contact's name should not be empty.
-
*/
-
public void addContact(Contact contact) {
-
Log.w(TAG,
"**add start**");
-
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
-
-
String id = getContactID(contact.getName());
-
if(!id.equals(
"0")) {
-
Log.d(TAG,
"contact already exist. exit.");
-
}
else
if(contact.getName().trim().equals(
"")){
-
Log.d(TAG,
"contact name is empty. exit.");
-
}
else {
-
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
-
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE,
null)
-
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME,
null)
-
.build());
-
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
-
.withValueBackReference(COLUMN_RAW_CONTACT_ID,
0)
-
.withValue(COLUMN_MIMETYPE, MIMETYPE_STRING_NAME)
-
.withValue(COLUMN_NAME, contact.getName())
-
.build());
-
Log.d(TAG,
"add name: " + contact.getName());
-
-
if(!contact.getNumber().trim().equals(
"")) {
-
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
-
.withValueBackReference(COLUMN_RAW_CONTACT_ID,
0)
-
.withValue(COLUMN_MIMETYPE, MIMETYPE_STRING_PHONE)
-
.withValue(COLUMN_NUMBER, contact.getNumber())
-
.withValue(COLUMN_NUMBER_TYPE, contact.getNumberType())
-
.build());
-
Log.d(TAG,
"add number: " + contact.getNumber());
-
}
-
-
if(!contact.getEmail().trim().equals(
"")) {
-
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
-
.withValueBackReference(COLUMN_RAW_CONTACT_ID,
0)
-
.withValue(COLUMN_MIMETYPE, MIMETYPE_STRING_EMAIL)
-
.withValue(COLUMN_EMAIL, contact.getEmail())
-
.withValue(COLUMN_EMAIL_TYPE, contact.getEmailType())
-
.build());
-
Log.d(TAG,
"add email: " + contact.getEmail());
-
}
-
-
try {
-
contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
-
Log.d(TAG,
"add contact success.");
-
}
catch (Exception e) {
-
Log.d(TAG,
"add contact failed.");
-
Log.e(TAG, e.getMessage());
-
}
-
}
-
Log.w(TAG,
"**add end**");
-
-
}
-
-
/**
-
* Delete contacts who's name equals contact.getName();
-
* @param contact
-
*/
-
public void deleteContact(Contact contact) {
-
Log.w(TAG,
"**delete start**");
-
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
-
-
String id = getContactID(contact.getName());
-
//delete contact
-
ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI)
-
.withSelection(ContactsContract.RawContacts.CONTACT_ID+
"="+id,
null)
-
.build());
-
//delete contact information such as phone number,email
-
ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
-
.withSelection(COLUMN_CONTACT_ID +
"=" + id,
null)
-
.build());
-
Log.d(TAG,
"delete contact: " + contact.getName());
-
-
try {
-
contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
-
Log.d(TAG,
"delete contact success");
-
}
catch (Exception e) {
-
Log.d(TAG,
"delete contact failed");
-
Log.e(TAG, e.getMessage());
-
}
-
Log.w(TAG,
"**delete end**");
-
}
-
-
/**
-
* @param contactOld The contact wants to be updated. The name should exists.
-
* @param contactNew
-
*/
-
public void updateContact(Contact contactOld, Contact contactNew) {
-
Log.w(TAG,
"**update start**");
-
String id = getContactID(contactOld.getName());
-
if(id.equals(
"0")) {
-
Log.d(TAG, contactOld.getName()+
" not exist.");
-
}
else
if(contactNew.getName().trim().equals(
"")){
-
Log.d(TAG,
"contact name is empty. exit.");
-
}
else
if(!getContactID(contactNew.getName()).equals(
"0")){
-
Log.d(TAG,
"new contact name already exist. exit.");
-
}
else {
-
-
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
-
-
//update name
-
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
-
.withSelection(COLUMN_CONTACT_ID +
"=? AND " + COLUMN_MIMETYPE +
"=?",
-
new String[]{id, MIMETYPE_STRING_NAME})
-
.withValue(COLUMN_NAME, contactNew.getName())
-
.build());
-
Log.d(TAG,
"update name: " + contactNew.getName());
-
-
//update number
-
if(!contactNew.getNumber().trim().equals(
"")) {
-
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
-
.withSelection(COLUMN_CONTACT_ID +
"=? AND " + COLUMN_MIMETYPE +
"=?",
-
new String[]{id, MIMETYPE_STRING_PHONE})
-
.withValue(COLUMN_NUMBER, contactNew.getNumber())
-
.withValue(COLUMN_NUMBER_TYPE, contactNew.getNumberType())
-
.build());
-
Log.d(TAG,
"update number: " + contactNew.getNumber());
-
}
-
-
//update email if mail
-
if(!contactNew.getEmail().trim().equals(
"")) {
-
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
-
.withSelection(COLUMN_CONTACT_ID +
"=? AND " + COLUMN_MIMETYPE +
"=?",
-
new String[]{id, MIMETYPE_STRING_EMAIL})
-
.withValue(COLUMN_EMAIL, contactNew.getEmail())
-
.withValue(COLUMN_EMAIL_TYPE, contactNew.getEmailType())
-
.build());
-
Log.d(TAG,
"update email: " + contactNew.getEmail());
-
}
-
-
try {
-
contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
-
Log.d(TAG,
"update success");
-
}
catch (Exception e) {
-
Log.d(TAG,
"update failed");
-
Log.e(TAG, e.getMessage());
-
}
-
}
-
Log.w(TAG,
"**update end**");
-
}
-
}
Contact.java
-
package com.example.siqi.contacts;
-
-
public
class Contact {
-
private String email;
-
private String emailType;
-
private String id;
-
private String name;
-
private String number;
-
private String numberType;
-
-
public Contact(){
-
}
-
-
public Contact(Contact contact){
-
this.name = contact.getName();
-
this.number = contact.getNumber();
-
this.numberType = contact.getNumberType();
-
this.email = contact.getEmail();
-
this.emailType = contact.getEmailType();
-
}
-
-
public String getEmail() {
-
return email;
-
}
-
public String getEmailType() {
-
return emailType;
-
}
-
public String getId() {
-
return id;
-
}
-
public String getName() {
-
return name;
-
}
-
public String getNumber() {
-
return number;
-
}
-
public String getNumberType() {
-
return numberType;
-
}
-
public void setEmail(String email) {
-
this.email = email;
-
}
-
public void setEmailType(String emailType) {
-
this.emailType = emailType;
-
}
-
public void setId(String id) {
-
this.id = id;
-
}
-
public void setName(String name) {
-
this.name = name;
-
}
-
public void setNumber(String number) {
-
this.number = number;
-
}
-
public void setNumberType(String numberType) {
-
this.numberType = numberType;
-
}
-
-
}
MainActivity.java
-
package com.example.siqi.contacts;
-
-
import android.os.Bundle;
-
import android.app.Activity;
-
import android.view.Menu;
-
-
public
class MainActivity extends Activity {
-
-
@Override
-
public void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
-
ContactsManager cm =
new ContactsManager(
this.getContentResolver());
-
-
cm.searchContact(
"张一");
-
-
Contact contact =
new Contact();
-
contact.setName(
"张一");
-
contact.setEmail(
"test@test.com");
-
contact.setNumber(
"123456789");
-
-
//test addContact
-
cm.addContact(contact);
-
cm.searchContact(
"张一");
-
-
//test updateContact
-
Contact contactNew =
new Contact(contact);
-
contactNew.setName(
"张二");
-
contactNew.setNumber(
"987654321");
-
contactNew.setEmail(
"newEmail@test");
-
cm.updateContact(contact, contactNew);
-
cm.searchContact(
"张一");
-
cm.searchContact(
"张二");
-
-
//test deleteContact
-
cm.deleteContact(contactNew);
-
cm.searchContact(
"张二");
-
-
-
}
-
-
@Override
-
public boolean onCreateOptionsMenu(Menu menu) {
-
getMenuInflater().inflate(R.menu.activity_main, menu);
-
return
true;
-
}
-
}
项目需要添加权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
结果:
-
11-
07
15:
20:
00.873: W/ContactsManager(
30113): **search start**
-
11-
07
15:
20:
00.873: D/ContactsManager(
30113): search name: 张一
-
11-
07
15:
20:
00.943: D/ContactsManager(
30113): 张一 not exist. exit.
-
11-
07
15:
20:
00.943: W/ContactsManager(
30113): **search end**
-
11-
07
15:
20:
00.943: W/ContactsManager(
30113): **add start**
-
11-
07
15:
20:
00.973: D/ContactsManager(
30113): add name: 张一
-
11-
07
15:
20:
01.004: D/ContactsManager(
30113): add number:
123456789
-
11-
07
15:
20:
01.004: D/ContactsManager(
30113): add email: test
@test.com
-
11-
07
15:
20:
01.224: D/ContactsManager(
30113): add contact success.
-
11-
07
15:
20:
01.224: W/ContactsManager(
30113): **add end**
-
11-
07
15:
20:
01.224: W/ContactsManager(
30113): **search start**
-
11-
07
15:
20:
01.224: D/ContactsManager(
30113): search name: 张一
-
11-
07
15:
20:
01.243: D/ContactsManager(
30113): find id:
30
-
11-
07
15:
20:
01.273: D/ContactsManager(
30113): find number:
123456789
-
11-
07
15:
20:
01.273: D/ContactsManager(
30113): find numberType:
null
-
11-
07
15:
20:
01.323: D/ContactsManager(
30113): find email: test
@test.com
-
11-
07
15:
20:
01.323: D/ContactsManager(
30113): find emailType:
null
-
11-
07
15:
20:
01.334: W/ContactsManager(
30113): **search end**
-
11-
07
15:
20:
01.334: W/ContactsManager(
30113): **update start**
-
11-
07
15:
20:
01.393: D/ContactsManager(
30113): update name: 张二
-
11-
07
15:
20:
01.403: D/ContactsManager(
30113): update number:
987654321
-
11-
07
15:
20:
01.403: D/ContactsManager(
30113): update email: newEmail
@test
-
11-
07
15:
20:
01.723: D/ContactsManager(
30113): update success
-
11-
07
15:
20:
01.723: W/ContactsManager(
30113): **update end**
-
11-
07
15:
20:
01.723: W/ContactsManager(
30113): **search start**
-
11-
07
15:
20:
01.723: D/ContactsManager(
30113): search name: 张一
-
11-
07
15:
20:
01.743: D/ContactsManager(
30113): 张一 not exist. exit.
-
11-
07
15:
20:
01.743: W/ContactsManager(
30113): **search end**
-
11-
07
15:
20:
01.743: W/ContactsManager(
30113): **search start**
-
11-
07
15:
20:
01.754: D/ContactsManager(
30113): search name: 张二
-
11-
07
15:
20:
01.773: D/ContactsManager(
30113): find id:
30
-
11-
07
15:
20:
01.803: D/ContactsManager(
30113): find number:
987654321
-
11-
07
15:
20:
01.813: D/ContactsManager(
30113): find numberType:
null
-
11-
07
15:
20:
01.844: D/ContactsManager(
30113): find email: newEmail
@test
-
11-
07
15:
20:
01.844: D/ContactsManager(
30113): find emailType:
null
-
11-
07
15:
20:
01.853: W/ContactsManager(
30113): **search end**
-
11-
07
15:
20:
01.853: W/ContactsManager(
30113): **delete start**
-
11-
07
15:
20:
01.874: D/ContactsManager(
30113): delete contact: 张二
-
11-
07
15:
20:
01.953: D/ContactsManager(
30113): delete contact success
-
11-
07
15:
20:
01.953: W/ContactsManager(
30113): **delete end**
-
11-
07
15:
20:
01.953: W/ContactsManager(
30113): **search start**
-
11-
07
15:
20:
01.953: D/ContactsManager(
30113): search name: 张二
-
11-
07
15:
20:
01.973: D/ContactsManager(
30113): 张二 not exist. exit.
-
11-
07
15:
20:
01.973: W/ContactsManager(
30113): **search end**
源代码中的Log.d以及Log.w是android输出日志的API,就当作System.out吧。
这这是一段简单的示例。在android中,同一个联系人可以对应多个号码和邮件,当然也还有其他的信息,比如邮编地址,webpage等等,这些都没有在这里实现。在这里,默认每个联系人只有一个号码和一个邮件。
对联系人的添加/更新,只需要添加/更新数据(name,number,email)到表data就可以了,data表的结构:
系统会自动的在raw_contacts,和contacts添加/更新联系人的ID和NAME以及其他的信息。
删除要删除表raw_contacts和表data的相应数据。但是在删除后发现data表的数据可以删除,但是raw_contacts的数据没有删除,只是一些标志位改变了,例如raw_contact_id变成了空。
另:我试了很多方式,试图删除raw_contacts的记录,但是没有成功。希望有谁知道怎么删除的告诉我。
ContentProvider机制读写联系人信息
本文转自[这里](https://blog.csdn.net/liuhe688/article/details/7006556)
今天我们来讲解一下如何利用ContentProvider机制读写联系人信息。
在Android中,ContentProvider是一种数据包装器,适合在不同进程间实现信息的共享。例如,在Android中SQLite数据库是一个典型的数据源,我们可以把它封装到ContentProvider中,这样就可以很好的为其他应用提供信息共享服务。其他应用在访问ContentProvider时,可以使用一组类似REST的URI的方式进行数据操作,大大简化了读写信息的复杂度。例如,如果要从封装图书数据库的ContentProvider获取一组图书,需要使用类似以下形式的URI:
content://com.scott.book.BookProvider/books
而要从图书数据库中获取指定图书(比如23号图书),需要使用类似以下形式的URI:
content://com.scott.book.BookProvider/books/23
注:ContentProvider是一个抽象类,定义了一系列操作数据的方法模板,BookProvider需要实现这些方法,实现图书信息的各种操作。
那么,现在知道了具体的URI之后,我们又如何操作进而取得数据呢?
此时,我们就要了解ContentResolver这个类,它跟ContentProvider是对应的关系,我们正是通过它来与ContentProvider进行数据交换的。android.content.Context类为我们定义了getContentResolver()方法,用于获取一个ContentResolver对象,如果我们在运行期可以通过getContext()获取当前Context实例对象,就可以通过这个实例对象所提供的getContentResolver()方法获取到ContentResolver类型的实例对象,进而可以操作对应的数据。
下面我们就通过联系人实例对这种机制进行演示。
在Android中,联系人的操作都是通过一个统一的途径来读写数据的,我们打开/data/data/com.android.providers.contacts可以看到联系人的数据源:
有兴趣的朋友可以导出这个文件,用专业的工具软件打开看一下表结构。
对这个SQLite类型的数据源的封装后,联系人就以ContentProvider的形式为其他应用进程提供联系人的读写服务,我们就可以顺利成章的操作自己的联系人信息了。
为了方便测试,我们先添加两个联系人到数据源中,如图所示:
我们看到,每个联系人都有两个电话号码和两个邮箱账号,分别为家庭座机号码、移动手机号码、家庭邮箱账号和工作邮箱账号。当然在添加联系人时有很多其他信息,我们这里都没有填写,只选择了最常用的电话和邮箱,主要是方便演示这个过程。
在演示代码之前,我们需要了解一下android.provider.ContactsContract这个类(注:在较早的版本中是android.provider.Contacts这个类,不过现在已被废弃,不建议使用),它定义了各种联系人相关的URI和每一种类型信息的属性信息:
有兴趣的朋友还可以读一下源代码,不过比较多,而且内部类使用的特别多,读起来有一定的困难,还是要做好心理准备。
下面我们通过一个项目,来演示一下联系人操作的具体过程。新建一个名为provider的项目,创建一个名为ContactsReadTest的测试用例,如下:
-
package com.scott.provider;
-
-
import java.util.ArrayList;
-
-
import android.content.ContentResolver;
-
import android.database.Cursor;
-
import android.net.Uri;
-
import android.provider.ContactsContract;
-
import android.test.AndroidTestCase;
-
import android.util.Log;
-
-
public
class ContactsReadTest extends AndroidTestCase {
-
-
private
static
final String TAG =
"ContactsReadTest";
-
-
//[content://com.android.contacts/contacts]
-
private
static
final Uri CONTACTS_URI = ContactsContract.Contacts.CONTENT_URI;
-
//[content://com.android.contacts/data/phones]
-
private
static
final Uri PHONES_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
-
//[content://com.android.contacts/data/emails]
-
private
static
final Uri EMAIL_URI = ContactsContract.CommonDataKinds.Email.CONTENT_URI;
-
-
private
static
final String _ID = ContactsContract.Contacts._ID;
-
private
static
final String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;
-
private
static
final String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER;
-
private
static
final String CONTACT_ID = ContactsContract.Data.CONTACT_ID;
-
-
private
static
final String PHONE_NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;
-
private
static
final String PHONE_TYPE = ContactsContract.CommonDataKinds.Phone.TYPE;
-
private
static
final String EMAIL_DATA = ContactsContract.CommonDataKinds.Email.DATA;
-
private
static
final String EMAIL_TYPE = ContactsContract.CommonDataKinds.Email.TYPE;
-
-
public void testReadContacts() {
-
ContentResolver resolver = getContext().getContentResolver();
-
Cursor c = resolver.query(CONTACTS_URI,
null,
null,
null,
null);
-
while (c.moveToNext()) {
-
int _id = c.getInt(c.getColumnIndex(_ID));
-
String displayName = c.getString(c.getColumnIndex(DISPLAY_NAME));
-
-
Log.i(TAG, displayName);
-
-
ArrayList<String> phones =
new ArrayList<String>();
-
ArrayList<String> emails =
new ArrayList<String>();
-
-
String selection = CONTACT_ID +
"=" + _id;
//the 'where' clause
-
-
//获取手机号
-
int hasPhoneNumber = c.getInt(c.getColumnIndex(HAS_PHONE_NUMBER));
-
if (hasPhoneNumber >
0) {
-
Cursor phc = resolver.query(PHONES_URI,
null, selection,
null,
null);
-
while (phc.moveToNext()) {
-
String phoneNumber = phc.getString(phc.getColumnIndex(PHONE_NUMBER));
-
int phoneType = phc.getInt(phc.getColumnIndex(PHONE_TYPE));
-
phones.add(getPhoneTypeNameById(phoneType) +
" : " + phoneNumber);
-
}
-
phc.close();
-
}
-
-
Log.i(TAG,
"phones: " + phones);
-
-
//获取邮箱
-
Cursor emc = resolver.query(EMAIL_URI,
null, selection,
null,
null);
-
while (emc.moveToNext()) {
-
String emailData = emc.getString(emc.getColumnIndex(EMAIL_DATA));
-
int emailType = emc.getInt(emc.getColumnIndex(EMAIL_TYPE));
-
emails.add(getEmailTypeNameById(emailType) +
" : " + emailData);
-
}
-
emc.close();
-
-
Log.i(TAG,
"emails: " + emails);
-
}
-
c.close();
-
}
-
-
private String getPhoneTypeNameById(int typeId) {
-
switch (typeId) {
-
case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
return
"home";
-
case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
return
"mobile";
-
case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
return
"work";
-
default:
return
"none";
-
}
-
}
-
-
private String getEmailTypeNameById(int typeId) {
-
switch (typeId) {
-
case ContactsContract.CommonDataKinds.Email.TYPE_HOME:
return
"home";
-
case ContactsContract.CommonDataKinds.Email.TYPE_WORK:
return
"work";
-
case ContactsContract.CommonDataKinds.Email.TYPE_OTHER:
return
"other";
-
default:
return
"none";
-
}
-
}
-
}
为了使这个测试用例运行起来,我们需要在AndroidManifest.xml中配置一下测试设备的声明,它与<application>元素处于同一级别位置:
-
<!-- 配置测试设备的主类和目标包 -->
-
<instrumentation android:name="android.test.InstrumentationTestRunner"
-
android:targetPackage=
"com.scott.provider"/>
然后再配置使用测试类库声明,它与<activity>元素处于同一级别位置:
-
<!-- 配置测试要使用的类库 -->
-
<uses-library android:name="android.test.runner"/>
最后,还有一个重要的声明需要配置,就是读取联系人权限,声明如下:
-
<!-- 读取联系人 -->
-
<uses-permission android:name="android.permission.READ_CONTACTS"/>
经过以上准备工作,这个测试用例就可以运转起来了,我们运行一下testReadContacts()方法,打印结果如下:
看来联系人里的信息都被我们准确无误的读取出来了。
如果我们在一个Activity里运行读取联系人的代码,不仅可以使用ContentResolver直接进行读取操作(即查询),还可以使用Activity提供的managedQuery方法方便的实现同样的效果,我们来看一下这个方法的具体代码:
-
public final Cursor managedQuery(Uri uri,
-
String[] projection,
-
String selection,
-
String[] selectionArgs,
-
String sortOrder)
-
{
-
Cursor c = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
-
if (c !=
null) {
-
startManagingCursor(c);
-
}
-
return c;
-
}
我们发现,其实它还是使用了ContentResolver进行查询操作,但是多了一步startManagingCursor的操作,它会根据Activity的生命周期对Cursor对象进行管理,避免了一些因Cursor是否释放引起的问题,所以非常方便,大大简化了我们的工作量。
接下来我们将要尝试将一个联系人信息添加到系统联系人的数据源中,实现对联系人的写入操作。我们新建一个名为ContactsWriteTest的测试用例,如下:
-
package com.scott.provider;
-
-
import java.util.ArrayList;
-
-
import android.content.ContentProviderOperation;
-
import android.content.ContentProviderResult;
-
import android.content.ContentResolver;
-
import android.net.Uri;
-
import android.provider.ContactsContract;
-
import android.test.AndroidTestCase;
-
import android.util.Log;
-
-
public
class ContactsWriteTest extends AndroidTestCase {
-
-
private
static
final String TAG =
"ContactsWriteTest";
-
-
//[content://com.android.contacts/raw_contacts]
-
private
static
final Uri RAW_CONTACTS_URI = ContactsContract.RawContacts.CONTENT_URI;
-
//[content://com.android.contacts/data]
-
private
static
final Uri DATA_URI = ContactsContract.Data.CONTENT_URI;
-
-
private
static
final String ACCOUNT_TYPE = ContactsContract.RawContacts.ACCOUNT_TYPE;
-
private
static
final String ACCOUNT_NAME = ContactsContract.RawContacts.ACCOUNT_NAME;
-
-
private
static
final String RAW_CONTACT_ID = ContactsContract.Data.RAW_CONTACT_ID;
-
private
static
final String MIMETYPE = ContactsContract.Data.MIMETYPE;
-
-
private
static
final String NAME_ITEM_TYPE = ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE;
-
private
static
final String DISPLAY_NAME = ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME;
-
-
private
static
final String PHONE_ITEM_TYPE = ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE;
-
private
static
final String PHONE_NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;
-
private
static
final String PHONE_TYPE = ContactsContract.CommonDataKinds.Phone.TYPE;
-
private
static
final
int PHONE_TYPE_HOME = ContactsContract.CommonDataKinds.Phone.TYPE_HOME;
-
private
static
final
int PHONE_TYPE_MOBILE = ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE;
-
-
private
static
final String EMAIL_ITEM_TYPE = ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE;
-
private
static
final String EMAIL_DATA = ContactsContract.CommonDataKinds.Email.DATA;
-
private
static
final String EMAIL_TYPE = ContactsContract.CommonDataKinds.Email.TYPE;
-
private
static
final
int EMAIL_TYPE_HOME = ContactsContract.CommonDataKinds.Email.TYPE_HOME;
-
private
static
final
int EMAIL_TYPE_WORK = ContactsContract.CommonDataKinds.Email.TYPE_WORK;
-
-
private
static
final String AUTHORITY = ContactsContract.AUTHORITY;
-
-
public void testWriteContacts() throws Exception {
-
ArrayList<ContentProviderOperation> operations =
new ArrayList<ContentProviderOperation>();
-
-
ContentProviderOperation operation = ContentProviderOperation.newInsert(RAW_CONTACTS_URI)
-
.withValue(ACCOUNT_TYPE,
null)
-
.withValue(ACCOUNT_NAME,
null)
-
.build();
-
operations.add(operation);
-
-
//添加联系人名称操作
-
operation = ContentProviderOperation.newInsert(DATA_URI)
-
.withValueBackReference(RAW_CONTACT_ID,
0)
-
.withValue(MIMETYPE, NAME_ITEM_TYPE)
-
.withValue(DISPLAY_NAME,
"Scott Liu")
-
.build();
-
operations.add(operation);
-
-
//添加家庭座机号码
-
operation = ContentProviderOperation.newInsert(DATA_URI)
-
.withValueBackReference(RAW_CONTACT_ID,
0)
-
.withValue(MIMETYPE, PHONE_ITEM_TYPE)
-
.withValue(PHONE_TYPE, PHONE_TYPE_HOME)
-
.withValue(PHONE_NUMBER,
"01034567890")
-
.build();
-
operations.add(operation);
-
-
//添加移动手机号码
-
operation = ContentProviderOperation.newInsert(DATA_URI)
-
.withValueBackReference(RAW_CONTACT_ID,
0)
-
.withValue(MIMETYPE, PHONE_ITEM_TYPE)
-
.withValue(PHONE_TYPE, PHONE_TYPE_MOBILE)
-
.withValue(PHONE_NUMBER,
"13034567890")
-
.build();
-
operations.add(operation);
-
-
//添加家庭邮箱
-
operation = ContentProviderOperation.newInsert(DATA_URI)
-
.withValueBackReference(RAW_CONTACT_ID,
0)
-
.withValue(MIMETYPE, EMAIL_ITEM_TYPE)
-
.withValue(EMAIL_TYPE, EMAIL_TYPE_HOME)
-
.withValue(EMAIL_DATA,
"scott@android.com")
-
.build();
-
operations.add(operation);
-
-
//添加工作邮箱
-
operation = ContentProviderOperation.newInsert(DATA_URI)
-
.withValueBackReference(RAW_CONTACT_ID,
0)
-
.withValue(MIMETYPE, EMAIL_ITEM_TYPE)
-
.withValue(EMAIL_TYPE, EMAIL_TYPE_WORK)
-
.withValue(EMAIL_DATA,
"scott@msapple.com")
-
.build();
-
operations.add(operation);
-
-
ContentResolver resolver = getContext().getContentResolver();
-
//批量执行,返回执行结果集
-
ContentProviderResult[] results = resolver.applyBatch(AUTHORITY, operations);
-
for (ContentProviderResult result : results) {
-
Log.i(TAG, result.uri.toString());
-
}
-
}
-
}
在上面的代码中,我们把整个操作分为几个ContentProviderOperation操作,并将他们做批处理操作,我们也许注意到,从第二个操作开始,每一项都有一个withValueBackReference(RAW_CONTACT_ID, 0)步骤,它参照了第一项操作新添加的联系人的id,因为是批处理,我们插入数据前并不知道id的值,不过这个不用担心,在进行批处理插入数据时,它会重新引用新的id值,不会影响最终的结果。
当然,这个也不能忘了配置写入联系人的权限声明:
-
<!-- 写入联系人 -->
-
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
经过以上步骤之后,我们运行一下testWriteContacts()方法,看看联系人是否添加进去了: