淺談Android手機聯(lián)系人開發(fā)之增刪查改功能
最近在做手機聯(lián)系人的功能模塊的時候,遇到了很多的坑,在網(wǎng)上搜索的有一些所謂的最全的手機聯(lián)系人開發(fā)的介紹還存在一些bug,所以我把我最近的項目心得和方法寫下來,既能幫助大家減少了解android開發(fā)手機聯(lián)系人的門檻,好,廢話少說,接下來直奔主題。
一、深入淺出手機聯(lián)系人的前奏(小米手機的data表跟模擬器的data表不一樣)
1、手機聯(lián)系人主要是對contacts2.db數(shù)據(jù)庫表的操縱,這個數(shù)據(jù)庫中有三個表是比較重要的,分別是data,raw_contacts,mimetyps這三個表。在下面的增刪查改模塊中,主要是根據(jù)表之間的關(guān)系來關(guān)聯(lián)的處理的。
1.1、data表
1.2、mimetypes表
1.3、raw_contacts表
1.4、下載contacts2.db表的方法
在eclipse中打開android模擬器,在eclipse導(dǎo)航欄的window->show View->other..->File Explorer.單擊eclipse導(dǎo)航欄右上角的DDMS,F(xiàn)ile Explorer 下的data->data->com.android.providers.contact->databases下就有contacts2.db數(shù)據(jù)庫了。單擊然后保存就可以了。
2、深入淺出之手機聯(lián)系人查詢模塊
/** * 通過輸入獲取電話號碼 */ public void number(String name1,long rawContactId) { //使用ContentResolver查找聯(lián)系人數(shù)據(jù) Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); //遍歷查詢結(jié)果,找到所需號碼 while (cursor.moveToNext()) { //獲取聯(lián)系人ID String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); //獲取聯(lián)系人的名字 String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); if (name1.equals(contactName)) { //使用ContentResolver查找聯(lián)系人的電話號碼和用戶名 Cursor phone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null); if (phone.moveToNext()) { String phoneNumber1 = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));//電話號碼 String phoneName1 = phone.getString(phone.getColumnIndex(Phone.DISPLAY_NAME));//姓名 phoneNumber.setText(phoneNumber1); name.setText(phoneName1); } //獲取郵箱信息 Cursor emails =getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID+"="+contactId,null,null); while(emails.moveToNext()){ String emailAddress =emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); email.setText(emailAddress); } //獲取IM信息 Cursor cursorQQ =getContentResolver().query(ContactsContract.Data.CONTENT_URI,null,ContactsContract.Data.RAW_CONTACT_ID+"="+rawContactId + " AND " + "mimetype_id=2",null,null); while(cursorQQ.moveToNext()){ //獲取公司信息 String im1 = cursorQQ.getString(cursorQQ.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)); qq.setText(im1); } //獲取公司信息 Cursor cursorCompany =getContentResolver().query(ContactsContract.Data.CONTENT_URI,null,ContactsContract.Data.RAW_CONTACT_ID+"="+rawContactId + " AND " + "mimetype_id = 4",null,null); while(cursorCompany.moveToNext()){ String company1=cursorCompany.getString(cursorCompany.getColumnIndex("data1")); String position1=cursorCompany.getString(cursorCompany.getColumnIndex("data4")); position.setText(position1); company.setText(company1); } } } }
3、深入淺出之手機聯(lián)系人增加模塊
//增加聯(lián)系人 public void addContact(String name, String phoneNumber,String email,String company,String position,String im) { /* 往 raw_contacts 中添加數(shù)據(jù),并獲取添加的id號*/ /* 往 raw_contacts 中添加數(shù)據(jù),并獲取添加的id號*/ Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentValues values = new ContentValues(); long rawContactId= ContentUris.parseId(resolver.insert(uri, values)); //插入data表 uri = Uri.parse("content://com.android.contacts/data"); // 向data表插入數(shù)據(jù) if (name != "") { values.put("raw_contact_id", rawContactId); values.put("mimetype", "vnd.android.cursor.item/name"); values.put("data2", name); resolver.insert(uri, values); } // 向data表插入電話號碼 if ( phoneNumber != "") { values.clear(); values.put("raw_contact_id", rawContactId); values.put("mimetype", "vnd.android.cursor.item/phone_v2"); values.put("data2", "2"); values.put("data1", phoneNumber); resolver.insert(uri, values); } //向data表中插入郵箱 if (email!= "") { // 添加Email values.clear(); values.put("raw_contact_id", rawContactId); values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); values.put(Email.DATA, email); values.put(Email.TYPE, Email.TYPE_WORK); resolver.insert(uri, values); } //向data表中插入聯(lián)系人的組織 if(company!=""&&position!=""){ //organization values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Organization.MIMETYPE, Organization.CONTENT_ITEM_TYPE); values.put(Organization.LABEL, name); values.put(Organization.TITLE, position); values.put(Organization.COMPANY, company); values.put(Organization.TYPE,Organization.TYPE_WORK); context.getContentResolver().insert(uri, values); } //向data表中插入聯(lián)系人的QQ if(im!=""){ //im values.clear(); values.put("raw_contact_id", rawContactId); values.put("mimetype", "vnd.android.cursor.item/im"); values.put(Im.DATA, im); values.put(Im.TYPE, Im.TYPE_WORK); resolver.insert(uri, values); } }
4、深入淺出之手機聯(lián)系人更新模塊
// 更新聯(lián)系人 public void updataContact(long rawContactId,String name,String number,String email,String company,String position,String im) { Uri uri = Uri.parse("content://com.android.contacts/data");//對data表的所有數(shù)據(jù)操作 ContentValues values = new ContentValues(); //更新電話號碼 values.put("data1", number); resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"5", rawContactId+""}) ; //更新聯(lián)系人姓名 values.clear(); values.put("data1", name); resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"7", rawContactId+""}) ; //更新email values.clear(); values.put("data1", email); resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"1", rawContactId+""}) ; //更新im values.clear(); values.put("data1", im); resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"2", rawContactId+""}) ; //更新company values.clear(); values.put("data1", company); values.put("data3",name); values.put("data4",position); resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"4", rawContactId+""}) ; }
5、深入淺出之手機聯(lián)系人刪除模塊
// 刪除聯(lián)系人 public void deleteContact(long rawContactId) { Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); Cursor cursor = resolver.query(uri,new String[]{RawContacts._ID},"contact_id=?",new String[]{String.valueOf(rawContactId) }, null ); if(cursor.moveToFirst()){ int id = cursor.getInt(0); resolver.delete(uri, "_id=?",new String[]{id+""}); uri = Uri.parse("content://com.android.contacts/data"); resolver.delete(uri, "raw_contact_id=?",new String[]{id+""}); cursor.close(); } }
6、大話自制手機聯(lián)系人軟件與系統(tǒng)手機聯(lián)系人軟件的區(qū)別
6.1、系統(tǒng)的手機聯(lián)系人軟件在刪除單個聯(lián)系人的時候不是直接刪除的,然是通過把某個值設(shè)置為0,使得該手機聯(lián)系人信息不可見,根據(jù)網(wǎng)上的大多數(shù)實例都是直接把data數(shù)據(jù)庫表中的單個聯(lián)系人的信息直接delete了。
- Android獲取手機通訊錄、sim卡聯(lián)系人及調(diào)用撥號界面方法
- Android 獲取手機聯(lián)系人實例代碼詳解
- android利用ContentResolver訪問者獲取手機聯(lián)系人信息
- Android獲取手機聯(lián)系人信息
- Android獲取手機聯(lián)系人電話號碼并返回結(jié)果
- Android讀取手機通訊錄聯(lián)系人到自己項目
- android如何獲取手機聯(lián)系人的數(shù)據(jù)庫示例代碼
- Android編程實現(xiàn)讀取手機聯(lián)系人、撥號、發(fā)送短信及長按菜單操作方法實例小結(jié)
- Android ContentProvider獲取手機聯(lián)系人實例
- Android ContentProvider實現(xiàn)手機聯(lián)系人讀取和插入
相關(guān)文章
Android實現(xiàn)簡單斷點續(xù)傳和下載到本地功能
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)簡單斷點續(xù)傳和下載到本地功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11Android監(jiān)聽ScrollView滑動距離的簡單處理
這篇文章主要為大家詳細(xì)介紹了Android監(jiān)聽ScrollView滑動距離的簡單處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02Android實現(xiàn)內(nèi)存中數(shù)據(jù)保存到sdcard的方法
這篇文章主要介紹了Android實現(xiàn)內(nèi)存中數(shù)據(jù)保存到sdcard的方法,涉及Android的文件讀寫與I/O操作相關(guān)技巧,需要的朋友可以參考下2016-01-01音量控制鍵控制的音頻流(setVolumeControlStream)描述
當(dāng)開發(fā)多媒體應(yīng)用或者游戲應(yīng)用的時候,需要使用音量控制鍵來設(shè)置程序的音量大小,在Android系統(tǒng)中有多種音頻流,感興趣的朋友可以了解下2013-01-01Android Studio 3.0后出現(xiàn)AAPT2與“android.enableAapt2”問題的解決方法
這篇文章主要給大家介紹了關(guān)于Android Studio 3.0后出現(xiàn)AAPT2與“android.enableAapt2”問題的解決方法,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07Android動畫之補間動畫(Tween Animation)基礎(chǔ)學(xué)習(xí)
補間動畫是指定開始和結(jié)束的圖像狀態(tài),自動生成需要顯示的過度圖像的動畫。補間動畫又分為四種:移動,縮放,旋轉(zhuǎn),通明度等。下面就來給大家一篇關(guān)于Android中補間動畫的基礎(chǔ)知識,有需要的可以參考學(xué)習(xí)。2016-09-09Android如何基于坐標(biāo)對View進行模擬點擊事件詳解
這篇文章主要給大家介紹了關(guān)于Android如何基于坐標(biāo)對View進行模擬點擊事件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03