ContactsContract的三层数据结构还是比想象的要复杂,在写代码的过程中遇到很多错误,尤其是查询和删除操作,遇到较多问题,通过自己琢磨API和网上查找资料一一解决,终于实现了联系人的增、删、查、改。
后来在网上发现了这篇文章,它的对联系人的增删查改代码很详细,值得参考,在此分享出来:
联系人查询:
private void getContact() {
ContentResolver contentResolver = getContentResolver();
// 获得所有的联系人
Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
// 循环遍历
if (cursor.moveToFirst()) {
int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
int displayNameColumn = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
do {
// 获得联系人的ID号
String contactId = cursor.getString(idColumn);
// 获得联系人姓名
String disPlayName = cursor.getString(displayNameColumn);
Toast.makeText(MainContentProvider.this, "联系人姓名: "+disPlayName,
Toast.LENGTH_LONG).show();
Log.i("ContentProvider", "联系人姓名: "+disPlayName);
// 查看该联系人有多少个电话号码。如果没有这返回值为0
int phoneCount = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (phoneCount > 0) {
// 获得联系人的电话号码列表
Cursor phonesCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = " + contactId, null, null);
if (phonesCursor.moveToFirst()) {
do {
// 遍历所有的电话号码
String phoneNumber = phonesCursor
.getString(phonesCursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Toast.makeText(MainContentProvider.this, "联系人电话: "+phoneNumber,
Toast.LENGTH_LONG).show();
Log.i("ContentProvider", "联系人电话: "+phoneNumber);
} while (phonesCursor.moveToNext());
}
phonesCursor.close();
}
//获得联系人的EMAIL
Cursor emailCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID+" = "+contactId, null, null);
if(emailCursor.moveToFirst()){
do{
//遍历所有的email
String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA1));
Toast.makeText(MainContentProvider.this, "Email:"+email, Toast.LENGTH_LONG).show();
Log.i("ContentProvider", "Email: "+email);
} while(emailCursor.moveToNext());
}
emailCursor.close();
联系人删除:
private void delContact(MainContentProvider mainContentProvider,
String name) {
Cursor cursor = getContentResolver().query(Data.CONTENT_URI,
new String[]{Data.RAW_CONTACT_ID}, ContactsContract.Contacts.DISPLAY_NAME+"=?",
new String[]{name}, null);
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
if(cursor.moveToFirst()){
do{
long Id = cursor.getLong(cursor.getColumnIndex(Data.RAW_CONTACT_ID));
ops.add(ContentProviderOperation.newDelete(ContentUris.withAppendedId(RawContacts.CONTENT_URI,Id))
.build());
try {
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch (Exception e) {
}
}while(cursor.moveToNext());
cursor.close();
}
}
联系人更新:
private void updateContact(MainContentProvider mainContentProvider,
String oldname, String name, String phone, String email,
String website, String organization, String note) {
Cursor cursor = getContentResolver().query(Data.CONTENT_URI,
new String[]{Data.RAW_CONTACT_ID}, ContactsContract.Contacts.DISPLAY_NAME+"=?",
new String[]{oldname},null);
cursor.moveToFirst();
String id = cursor.getString(cursor.getColumnIndex(Data.RAW_CONTACT_ID));
cursor.close();
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
//更新电话号码
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(Data.RAW_CONTACT_ID + "=?"+" AND " + ContactsContract.Data.MIMETYPE + " = ?" +
" AND "+Phone.TYPE+"=?",
new String[]{String.valueOf(id),Phone.CONTENT_ITEM_TYPE,String.valueOf(Phone.TYPE_HOME)})
.withValue(Phone.NUMBER, phone)
.build());
//更新email
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(Data.RAW_CONTACT_ID + "=?"+" AND " + ContactsContract.Data.MIMETYPE + " = ?" +
" AND "+Email.TYPE+"=?",
new String[]{String.valueOf(id),Email.CONTENT_ITEM_TYPE,String.valueOf(Email.TYPE_WORK)})
.withValue(Email.DATA, email)
.build());
//更新姓名
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(Data.RAW_CONTACT_ID + "=?"+" AND " + ContactsContract.Data.MIMETYPE + " = ?",
new String[]{String.valueOf(id),StructuredName.CONTENT_ITEM_TYPE})
.withValue(StructuredName.DISPLAY_NAME, name)
.build());
联系人插入:
private void addContact(Context context, String name, String organisation,
String phone, String fax, String email, String address,
String website) {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DISABLED)
.build());
// add name
if (!name.equals("")) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
.build());
}
// add phone
if (!phone.equals("")) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, 1)
.build());
}
// add address
if (!address.equals("")) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, address)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE,
ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK)
.build());
}
// add logo image
// Bitmap bm = logo;
// if (bm != null) {
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
// byte[] photo = baos.toByteArray();
// if (photo != null) {
//
// ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
// .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
// .withValue(ContactsContract.Data.MIMETYPE,
// ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
// .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photo)
// .build());
//
// }
// }
try {
context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);