1. 程式人生 > >Android 通訊錄增刪改查

Android 通訊錄增刪改查

一、通訊錄應用介紹

通訊錄應用是Android自帶的應用程式,我們看到此應用的時候,可能只認為這是一個應用,用資料庫儲存資料,但是實際上不是這樣的。

通訊錄是ContentProvider的應用,通訊錄由兩部分組成:

(1)com.android.providers.contacts的ContentProvider:真正儲存資料的ContentProvider

(2)com.android.contacts:運用ContentResolver獲取資料的圖形使用者介面;

二、獲取ContactProvider的原始碼

Android原始碼: http://my.oschina.net/zhanglubing/blog/40623 用git獲取;

如果要獲取ContactProvider,則安裝git,並開啟git bash,輸入

git clone https://android.googlesource.com/platform/packages/providers/ContactsProvider.git 即可;

目錄結構如下:

為何要獲取ContactProvider的原始碼呢?

因為如果要訪問ContentProvider,必須要了解URI的設定(authority,path等);只有檢視原始碼才能夠知道;

AndroidManifest.xml為清單檔案,列出了ContactProvider的authorities,以及要訪問通訊錄需要的許可權;

  1. <uses-permissionandroid:name="android.permission.READ_CONTACTS"/>
  2. <uses-permissionandroid:name="android.permission.WRITE_CONTACTS"/>

主要的通訊錄程式為ContactsProvider2.java,authorities為:contacts或com.android.contacts;

三、通訊錄資料庫結構介紹

表結構如下:



通訊錄是存放在/data/data/com.android.providers.contacts/databases/contacts2.db,裡面主要的表有:

(1)raw_contacts:存放聯絡人的ID,

_id屬性為主鍵,宣告為autoincrement,即不需要手動設定,其他屬性也不需要手動設定就有預設值;

display_name屬性為姓名;

(2)mimetypes:存放資料的型別,比如"vnd.android.cursor.item/name"表示“姓名”型別的資料,"vnd.android.cursor.item/phone_v2"表示“電話”型別的資料;

(3)data:存放具體的資料;

raw_contact_id屬性用來連線raw_contacts表,每條記錄表示一個具體資料;我們主要的資料(email、phone等)都存放在data表;

data1屬性存放總資料;

data2屬性:

-如果此記錄存放姓名,則data2存放名;

-如果此記錄存放電話,則data2存放型別,比如手機、家電;

-如果此記錄存放組織,則data2存放型別,比如公司、其他;

-如果此記錄存放地址,則data2存放型別,比如住宅,單位等;

四、對通訊錄做增刪改查

簡單的說:對通訊錄操作就是對一個普通的ContentProvider操作;

1.Query

(1)根據電話號碼查詢姓名
  1. //根據電話號碼查詢姓名(在一個電話打過來時,如果此電話在通訊錄中,則顯示姓名)
  2. publicvoid testReadNameByPhone(){
  3. String phone = "12345678";
  4. //uri= content://com.android.contacts/data/phones/filter/#
  5. Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+phone);
  6. ContentResolver resolver = this.getContext().getContentResolver();
  7. Cursor cursor = resolver.query(uri, new String[]{Data.DISPLAY_NAME}, null, null, null); //從raw_contact表中返回display_name
  8. if(cursor.moveToFirst()){
  9. Log.i("Contacts", "name="+cursor.getString(0));
  10. }
  11. }

(2)查詢所有的聯絡人
  1. //讀取通訊錄的全部的聯絡人
  2. //需要先在raw_contact表中遍歷id,並根據id到data表中獲取資料
  3. publicvoid testReadAll(){
  4. //uri = content://com.android.contacts/contacts
  5. Uri uri = Uri.parse("content://com.android.contacts/contacts"); //訪問raw_contacts表
  6. ContentResolver resolver = this.getContext().getContentResolver();
  7. Cursor cursor = resolver.query(uri, new String[]{Data._ID}, null, null, null); //獲得_id屬性
  8. while(cursor.moveToNext()){
  9. StringBuilder buf = new StringBuilder();
  10. int id = cursor.getInt(0);//獲得id並且在data中尋找資料
  11. buf.append("id="+id);
  12. uri = Uri.parse("content://com.android.contacts/contacts/"+id+"/data"); //如果要獲得data表中某個id對應的資料,則URI為content://com.android.contacts/contacts/#/data
  13. Cursor cursor2 = resolver.query(uri, new String[]{Data.DATA1,Data.MIMETYPE}, null,null, null); //data1儲存各個記錄的總資料,mimetype存放記錄的型別,如電話、email等
  14. while(cursor2.moveToNext()){
  15. String data = cursor2.getString(cursor2.getColumnIndex("data1"));
  16. if(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/name")){ //如果是名字
  17. buf.append(",name="+data);
  18. }
  19. elseif(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/phone_v2")){ //如果是電話
  20. buf.append(",phone="+data);
  21. }
  22. elseif(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/email_v2")){ //如果是email
  23. buf.append(",email="+data);
  24. }
  25. elseif(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/postal-address_v2")){ //如果是地址
  26. buf.append(",address="+data);
  27. }
  28. elseif(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/organization")){ //如果是組織
  29. buf.append(",organization="+data);
  30. }
  31. }
  32. String str = buf.toString();
  33. Log.i("Contacts", str);
  34. }
  35. }
2.Insert (1)一步一步新增資料
  1. //一步一步新增資料
  2. publicvoid testAddContacts(){
  3. //插入raw_contacts表,並獲取_id屬性
  4. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  5. ContentResolver resolver = this.getContext().getContentResolver();
  6. ContentValues values = new ContentValues();
  7. long contact_id = ContentUris.parseId(resolver.insert(uri, values));
  8. //插入data表
  9. uri = Uri.parse("content://com.android.contacts/data");
  10. //add Name
  11. values.put("raw_contact_id", contact_id);
  12. values.put(Data.MIMETYPE,"vnd.android.cursor.item/name");
  13. values.put("data2", "zdong");
  14. values.put("data1", "xzdong");
  15. resolver.insert(uri, values);
  16. values.clear();
  17. //add Phone
  18. values.put("raw_contact_id", contact_id);
  19. values.put(Data.MIMETYPE,"vnd.android.cursor.item/phone_v2");
  20. values.put("data2", "2"); //手機
  21. values.put("data1", "87654321");
  22. resolver.insert(uri, values);
  23. values.clear();
  24. //add email
  25. values.put("raw_contact_id", contact_id);
  26. values.put(Data.MIMETYPE,"vnd.android.cursor.item/email_v2");
  27. values.put("data2", "2"); //單位
  28. values.put("data1", "[email protected]");
  29. resolver.insert(uri, values);
  30. }


(2)批量新增資料 核心程式碼: (1)ContentProviderOperation operation = ContentProviderOperation.newInsert(uri).withValue("key","value").build(); (2)resolver.applyBatch("authorities",operations);//批量提交
  1. <span style="font-size:18px;">publicvoid testAddContactsInTransaction() throws Exception {
  2. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  3. ContentResolver resolver = this.getContext().getContentResolver();
  4. ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
  5. // 向raw_contact表新增一條記錄
  6. //此處.withValue("account_name", null)一定要加,不然會拋NullPointerException
  7. ContentProviderOperation operation1 = ContentProviderOperation
  8. .newInsert(uri).withValue("account_name", null).build();
  9. operations.add(operation1);
  10. // 向data新增資料
  11. uri = Uri.parse("content://com.android.contacts/data");
  12. //新增姓名
  13. ContentProviderOperation operation2 = ContentProviderOperation
  14. .newInsert(uri).withValueBackReference("raw_contact_id", 0)
  15. //withValueBackReference的第二個引數表示引用operations[0]的操作的返回id作為此值
  16. .withValue("mimetype", "vnd.android.cursor.item/name")
  17. .withValue("data2", "xzdong").build();
  18. operations.add(operation2);
  19. //新增手機資料
  20. ContentProviderOperation operation3 = ContentProviderOperation
  21. .newInsert(uri).withValueBackReference("raw_contact_id", 0)
  22. .withValue("mimetype", "vnd.android.cursor.item/phone_v2")
  23. .withValue("data2", "2").withValue("data1", "0000000").build();
  24. operations.add(operation3);
  25. resolver.applyBatch("com.android.contacts", operations);
  26. }</span>
3.Delete 核心思想: (1)先在raw_contacts表根據姓名查出id; (2)在data表中只要raw_contact_id匹配的都刪除;
  1. publicvoid testDelete()throws Exception{
  2. String name = "xzdong";
  3. //根據姓名求id
  4. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  5. ContentResolver resolver = this.getContext().getContentResolver();
  6. Cursor cursor = resolver.query(uri, new String[]{Data._ID},"display_name=?", new String[]{name}, null);
  7. if(cursor.moveToFirst()){
  8. int id = cursor.getInt(0);
  9. //根據id刪除data中的相應資料
  10. resolver.delete(uri, "display_name=?", new String[]{name});
  11. uri = Uri.parse("content://com.android.contacts/data");
  12. resolver.delete(uri, "raw_contact_id=?", new String[]{id+""});
  13. }
  14. }
4.Update

核心思想:

(1)不需要更新raw_contacts,只需要更新data表;

(2)uri=content://com.android.contacts/data 表示對data表進行操作;

[java] view plaincopyprint?
  1. publicvoid testUpdate()throws Exception{
  2. int id = 1;
  3. String phone = "999999";
  4. Uri uri = Uri.parse("content://com.android.contacts/data");//對data表的所有資料操作
  5. ContentResolver resolver = this.getContext().getContentResolver();
  6. ContentValues values = new ContentValues();
  7. values.put("data1", phone);
  8. resolver.update(uri, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2",id+""})
  9. }

相關推薦

Android 通訊錄刪改

一、通訊錄應用介紹 通訊錄應用是Android自帶的應用程式,我們看到此應用的時候,可能只認為這是一個應用,用資料庫儲存資料,但是實際上不是這樣的。 通訊錄是ContentProvider的應用,通訊錄由兩部分組成: (1)com.android.providers.

Android入門 刪改通訊錄

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

【11】【3】【完結】Android GreenDao 刪改 實戰

我把這個demo 釋出到了git 上 我要去看看 需要可以去下載 我們需要對 greenDao做二次封裝 以便於使用 新建 dbmanager 檔案 裡面分別存放  CommonUtils DaoManager DaoManager 有四個作用 /** * 1 建

ObjectC----實現簡單的通訊錄(刪改)

經過兩天的低迷,狀態在慢慢的迴歸了,生活還要繼續,人生還需奮鬥! 祝:好人一生平安!!! ======================================================================== 題目描述: 1.建立AddressB

Android-GreenDao刪改以及底層實現簡介

GreenDao 初始化: public voidinitDB(Context context,String dbName) { this.context= context; DaoMaster.DevOpenHelper helper =newDaoMaster.DevO

android通訊錄開發 刪改(附Demo)

不廢話,直接開擼 主要邏輯程式碼如下 單查詢/增加聯絡人 /** * 寫入手機聯絡人 */ private void writeContact() { String name = "test";

Android實戰——第三方服務之Bmob後端雲的刪改、上傳文件、獲取文件、修改密碼(二)

tid blank 生成 src 上傳圖片 放置 第三方 b數 net 第三方服務之Bmob後端雲的增刪改查、上傳文件、獲取文件、修改密碼(二) 事先說明:這裏的一切操作都是在集成了BmobSDK之後實現的,如果對Bmob還不了解的話,請關註我第一篇Bmob文章 步

Android使用谷歌封裝好的api進行刪改

本博文是對上一篇使用sql語句進行增刪改查的修改,上一篇地址: https://blog.csdn.net/liyunfu233/article/details/84193577 本篇主介面程式碼: package com.example.createsqlitedemo02; i

Android 簡單資料庫(刪改

Android 簡單資料庫(增刪改查)       <Button android:id="@+id/insert_btn" android:layout_width="wrap_content"

Android : tablayout +側滑選單 + 豎立的tablayout +資料庫刪改+XListView+PullToRefresh 綜合

側拉選單 一個XListview載入,一個是PullToRefresh重新整理 一個是本地資料的重新整理一個是網路資料的重新整理 資料庫的增刪查 需要用到的許可權 <uses-permission android:name="android.permission.I

Android中使用OrmLite(一):表建立及刪改

OrmLite是一個輕量級的ORM框架,面向JAVA語言。也是時下流行的Android的ORM框架之一。在Android中使用Sqlite資料,如果又不想寫SQL,OrmLite或許是個不錯的選擇。 使用OrmLite,首先要在gradle

Android-Sqlite-OOP方式操作刪改

之前寫的資料庫增刪改查,是使用SQL語句來實現的,Google 就為Android開發人員考慮,就算不會SQL語句也能實現增刪改查,所以就有了OOP面向物件的增刪改查方式 其實這種OOP面向物件的增刪改查方式,最後系統會自動拼接成SQL語句,然後交給Sqlite.c執行,當然這種OOP面向物件的增刪改查有點

Android-SQLiteOpenHelper裡刪改

為什麼要寫一篇,Android-SQLiteOpenHelper裡增刪改查,的文章呢;   因為之前的方式是:MySQLiteOpenHelper(只負責 生成開啟據庫/生成開啟表/升級表),在其他端:完成此資料庫表的增刪改查邏輯處理,這樣程式碼有些分散 現在 MySQLiteOpenHelper(負責

Android Sqlite】萌動的sqlite資料庫,簡單實現:使用者刪改

sqlite資料的使用很常見呢,我們簡單學習一下app的登入、註冊、修改、刪除使用者吧! 下面就寫一個萌動的app註冊登入吧! 主頁面: 還有2個圖片按鈕(雖然不是很好看,但是將就吧→。→) EditView輸入框的監聽事件,2張圖片的切換 (為了找22,33的圖片

學習Android的SQLite中刪改功能!

文章目的:快速入門Android的SQLite增刪改查功能! 前言:通過之前文章的學習,你已經掌握了快速建立和升級資料庫的方法,接下來就該學習一下如何對錶中的資料進行操作了。我們可以對資料進行的操作有四種,即 CRUD。其中 C 代表新增(Create),R 代表查詢(R

android 使用SQLite對資料進行刪改、訪問

功能:用SQLitem完成資料庫的動態增刪改查功能,資料的儲存於訪問   SQLite資料庫程式設計  SimpleCursorAdapter和上下文選單基本用法   開發平臺:Android Studio 3.0.1整體框架:見程式碼及註釋:MainActivity.jav

Android資料庫一:sqlite語句刪改

SQLite資料型別 一般資料採用的固定的靜態資料型別,而SQLite採用的是動態資料型別,會根據存入值自動判斷。SQLite具有以下五種常用的資料型別: NULL: 這個值為空值; VARCHAR(n):長度不固定且其最大長度為 n 的字串,n不能超過

Android+伺服器上資料進行操作+mysql的刪改

我們都知道我們的資料都在資料庫上 我們同樣要對我們的資料進行操作,我們怎麼搞呢 我們首先要知道mysql.db這個東西,這是我們連結資料庫的包 然而我們發現這個東西一直報錯,經過編者的仔細尋找,終於解決了 這裡:我只說mac本的方法 第一步我們需要下載一個brew,開啟終端

xml編寫通訊錄(xml的刪改)

1.寫一個contact.xml檔案,用來存放通訊錄中的資訊 //寫一個通訊錄 public class WriteTel { public static void main(String[] args) throws IOException { //步驟:匯入Dem4

Android ORM——greenDAO 3之Properties、QueryBuilder與資料庫的刪改的基本語法應用(二)

引言 Android ORM——初識greenDAO 3及使用greenDAO 3前應該掌握的一些知識點介紹了greenDAO的配置步驟和一些重要的知識點,以及重要的角色的功能和聯絡,這一篇就正式開始結合點原始碼從應用greenDAO方面總結。在使用green