ContactsContract增删改查
package com.zhang.contactdemo;
import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
import android.os.RemoteException;
import android.provider.ContactsContract;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Mr.Z on 2016/11/18 0018.
* <p>
* ContactsContract defines an extensible database of contact-related information.
* Contact information is stored in a three-tier data model:
* <p>
* A row in the ContactsContract.Data table can store any kind of personal data,
* such as a phone number or email addresses. The set of data kinds that can be
* stored in this table is open-ended. There is a predefined set of common kinds,
* but any application can add its own data kinds.
* <p>
* <p>
* A row in the ContactsContract.RawContacts table represents a set of data describing
* a person and associated with a single account (for example, one of the user's Gmail
* accounts).
* <p>
* <p>
* A row in the ContactsContract.Contacts table represents an aggregate of one or more
* RawContacts presumably describing the same person. When data in or associated with
* the RawContacts table is changed, the affected aggregate contacts are updated as necessary.
*/
public class ContactManager {
/**
* @param context
* @return
*/
public static List<ContactBean> getContacts(Context context) {
List<ContactBean> contacts = new ArrayList<>();
ContentResolver resolver = context.getContentResolver();
//先查询出ContactsContract.RawContacts
Cursor cursor = resolver.query(ContactsContract.RawContacts.CONTENT_URI,
new String[]{ContactsContract.RawContacts._ID},
null,
null,
null);
ContactBean contact;
//遍历RawContacts
while (cursor.moveToNext()) {
contact = new ContactBean();
//RawContact的id
long rawContactId = cursor.getLong(cursor.getColumnIndex(ContactsContract.RawContacts._ID));
contact.setRawContactId(rawContactId);
//查询出RawContact中的ContactsContract.Data
Cursor c = resolver.query(ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.Data.RAW_CONTACT_ID + "=?",
new String[]{String.valueOf(rawContactId)},
null);
while (c.moveToNext()) {
String data1 = c.getString(c.getColumnIndex(ContactsContract.Data.DATA1));
String mimeType = c.getString(c.getColumnIndex(ContactsContract.Data.MIMETYPE));
if (mimeType.equals(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)) {
contact.setName(data1);
} else if (mimeType.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
contact.setPhone(data1);
}
}
contacts.add(contact);
c.close();
}
cursor.close();
return contacts;
}
/**
* @param context
* @param contact
*/
public static void addContact(Context context, ContactBean contact) {
ContentResolver resolver = context.getContentResolver();
ContentValues values = new ContentValues();
Uri rawContactUri = resolver.insert(ContactsContract.RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri);
ContentValues valuesData1 = new ContentValues();
valuesData1.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
valuesData1.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
valuesData1.put(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getPhone());
resolver.insert(ContactsContract.Data.CONTENT_URI, valuesData1);
ContentValues valuesData2 = new ContentValues();
valuesData2.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
valuesData2.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
valuesData2.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contact.getName());
resolver.insert(ContactsContract.Data.CONTENT_URI, valuesData2);
}
/**
* @param context
* @param contact
*/
public static void updateContact(Context context, ContactBean contact) {
ContentResolver resolver = context.getContentResolver();
ArrayList<ContentProviderOperation> ops = new ArrayList<>();
ops.add(ContentProviderOperation
.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(
ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "=?",
new String[]{
String.valueOf(contact.getRawContactId()),
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE})
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contact.getName())
.build());
ops.add(ContentProviderOperation
.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(
ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "=?",
new String[]{
String.valueOf(contact.getRawContactId()),
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE})
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getPhone()).build());
try {
resolver.applyBatch(ContactsContract.AUTHORITY, ops);
} catch (RemoteException | OperationApplicationException e) {
e.printStackTrace();
}
}
/**
* @param context
* @param contact
*/
public static void deleteContact(Context context, ContactBean contact) {
ContentResolver resolver = context.getContentResolver();
resolver.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts._ID + "=?",
new String[]{String.valueOf(contact.getRawContactId())});
}
}
通讯录的主要操作就是增删改查,还有一些别的内容可通过链接下载源码。
https://github.com/changchou/ContactDemo