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 contactops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI).withSelection(ContactsContract.RawContacts.CONTACT_ID+"="+id, null)                .build());//delete contact information such as phone number,emailops.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 nameops.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 numberif(!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: 12345678911-07 15:20:01.004: D/ContactsManager(30113): add email: test@test.com11-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: 3011-07 15:20:01.273: D/ContactsManager(30113): find number: 12345678911-07 15:20:01.273: D/ContactsManager(30113): find numberType: null11-07 15:20:01.323: D/ContactsManager(30113): find email: test@test.com11-07 15:20:01.323: D/ContactsManager(30113): find emailType: null11-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: 98765432111-07 15:20:01.403: D/ContactsManager(30113): update email: newEmail@test11-07 15:20:01.723: D/ContactsManager(30113): update success11-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: 3011-07 15:20:01.803: D/ContactsManager(30113): find number: 98765432111-07 15:20:01.813: D/ContactsManager(30113): find numberType: null11-07 15:20:01.844: D/ContactsManager(30113): find email: newEmail@test11-07 15:20:01.844: D/ContactsManager(30113): find emailType: null11-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 success11-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的记录,但是没有成功。希望有谁知道怎么删除的告诉我。

更多相关文章

  1. android 删除文件,打开指定的文件类型
  2. [Android(安卓)Pro] 创建快捷方式,删除快捷方式,查询是否存在快捷
  3. android常用数据库字段描述
  4. android Handlerr.removeCallbacksAndMessages(null)的妙用
  5. Android: TextView with border 带边框的TextView
  6. LayoutInflater.inflate()方法的介绍
  7. Android(安卓)ListView+image的使用
  8. android中使用local_manifest.xml添加软件
  9. Android(安卓)在程序中删除程序包

随机推荐

  1. android手机定位
  2. android webview增强版,对原生webview的一
  3. 读写Android中assets目录下的文件的方法
  4. 如何实现Android应用的启动画面(闪屏)?
  5. Android—启动内置APK和动态发送接收自定
  6. 浅谈android @id和@+id的区别
  7. android的消息机制 handler looper Messa
  8. Android的Activity, Intent 和 Service
  9. android的服务进程Service的创建及启动
  10. Android(安卓)补间动画之平移动画Transla