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,以及要訪問通訊錄需要的許可權;
- <uses-permissionandroid:name="android.permission.READ_CONTACTS"/>
- <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)根據電話號碼查詢姓名- //根據電話號碼查詢姓名(在一個電話打過來時,如果此電話在通訊錄中,則顯示姓名)
- publicvoid testReadNameByPhone(){
- String phone = "12345678";
- //uri= content://com.android.contacts/data/phones/filter/#
- Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+phone);
- ContentResolver resolver = this.getContext().getContentResolver();
- Cursor cursor = resolver.query(uri, new String[]{Data.DISPLAY_NAME}, null, null, null); //從raw_contact表中返回display_name
- if(cursor.moveToFirst()){
- Log.i("Contacts", "name="+cursor.getString(0));
- }
- }
(2)查詢所有的聯絡人
- //讀取通訊錄的全部的聯絡人
- //需要先在raw_contact表中遍歷id,並根據id到data表中獲取資料
- publicvoid testReadAll(){
- //uri = content://com.android.contacts/contacts
- Uri uri = Uri.parse("content://com.android.contacts/contacts"); //訪問raw_contacts表
- ContentResolver resolver = this.getContext().getContentResolver();
- Cursor cursor = resolver.query(uri, new String[]{Data._ID}, null, null, null); //獲得_id屬性
- while(cursor.moveToNext()){
- StringBuilder buf = new StringBuilder();
- int id = cursor.getInt(0);//獲得id並且在data中尋找資料
- buf.append("id="+id);
- uri = Uri.parse("content://com.android.contacts/contacts/"+id+"/data"); //如果要獲得data表中某個id對應的資料,則URI為content://com.android.contacts/contacts/#/data
- Cursor cursor2 = resolver.query(uri, new String[]{Data.DATA1,Data.MIMETYPE}, null,null, null); //data1儲存各個記錄的總資料,mimetype存放記錄的型別,如電話、email等
- while(cursor2.moveToNext()){
- String data = cursor2.getString(cursor2.getColumnIndex("data1"));
- if(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/name")){ //如果是名字
- buf.append(",name="+data);
- }
- elseif(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/phone_v2")){ //如果是電話
- buf.append(",phone="+data);
- }
- elseif(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/email_v2")){ //如果是email
- buf.append(",email="+data);
- }
- elseif(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/postal-address_v2")){ //如果是地址
- buf.append(",address="+data);
- }
- elseif(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/organization")){ //如果是組織
- buf.append(",organization="+data);
- }
- }
- String str = buf.toString();
- Log.i("Contacts", str);
- }
- }
- //一步一步新增資料
- publicvoid testAddContacts(){
- //插入raw_contacts表,並獲取_id屬性
- Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
- ContentResolver resolver = this.getContext().getContentResolver();
- ContentValues values = new ContentValues();
- long contact_id = ContentUris.parseId(resolver.insert(uri, values));
- //插入data表
- uri = Uri.parse("content://com.android.contacts/data");
- //add Name
- values.put("raw_contact_id", contact_id);
- values.put(Data.MIMETYPE,"vnd.android.cursor.item/name");
- values.put("data2", "zdong");
- values.put("data1", "xzdong");
- resolver.insert(uri, values);
- values.clear();
- //add Phone
- values.put("raw_contact_id", contact_id);
- values.put(Data.MIMETYPE,"vnd.android.cursor.item/phone_v2");
- values.put("data2", "2"); //手機
- values.put("data1", "87654321");
- resolver.insert(uri, values);
- values.clear();
- //add email
- values.put("raw_contact_id", contact_id);
- values.put(Data.MIMETYPE,"vnd.android.cursor.item/email_v2");
- values.put("data2", "2"); //單位
- values.put("data1", "[email protected]");
- resolver.insert(uri, values);
- }
(2)批量新增資料 核心程式碼: (1)ContentProviderOperation operation = ContentProviderOperation.newInsert(uri).withValue("key","value").build(); (2)resolver.applyBatch("authorities",operations);//批量提交
- <span style="font-size:18px;">publicvoid testAddContactsInTransaction() throws Exception {
- Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
- ContentResolver resolver = this.getContext().getContentResolver();
- ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
- // 向raw_contact表新增一條記錄
- //此處.withValue("account_name", null)一定要加,不然會拋NullPointerException
- ContentProviderOperation operation1 = ContentProviderOperation
- .newInsert(uri).withValue("account_name", null).build();
- operations.add(operation1);
- // 向data新增資料
- uri = Uri.parse("content://com.android.contacts/data");
- //新增姓名
- ContentProviderOperation operation2 = ContentProviderOperation
- .newInsert(uri).withValueBackReference("raw_contact_id", 0)
- //withValueBackReference的第二個引數表示引用operations[0]的操作的返回id作為此值
- .withValue("mimetype", "vnd.android.cursor.item/name")
- .withValue("data2", "xzdong").build();
- operations.add(operation2);
- //新增手機資料
- ContentProviderOperation operation3 = ContentProviderOperation
- .newInsert(uri).withValueBackReference("raw_contact_id", 0)
- .withValue("mimetype", "vnd.android.cursor.item/phone_v2")
- .withValue("data2", "2").withValue("data1", "0000000").build();
- operations.add(operation3);
- resolver.applyBatch("com.android.contacts", operations);
- }</span>
- publicvoid testDelete()throws Exception{
- String name = "xzdong";
- //根據姓名求id
- Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
- ContentResolver resolver = this.getContext().getContentResolver();
- Cursor cursor = resolver.query(uri, new String[]{Data._ID},"display_name=?", new String[]{name}, null);
- if(cursor.moveToFirst()){
- int id = cursor.getInt(0);
- //根據id刪除data中的相應資料
- resolver.delete(uri, "display_name=?", new String[]{name});
- uri = Uri.parse("content://com.android.contacts/data");
- resolver.delete(uri, "raw_contact_id=?", new String[]{id+""});
- }
- }
核心思想:
(1)不需要更新raw_contacts,只需要更新data表;
(2)uri=content://com.android.contacts/data 表示對data表進行操作;
[java] view plaincopyprint?- publicvoid testUpdate()throws Exception{
- int id = 1;
- String phone = "999999";
- Uri uri = Uri.parse("content://com.android.contacts/data");//對data表的所有資料操作
- ContentResolver resolver = this.getContext().getContentResolver();
- ContentValues values = new ContentValues();
- values.put("data1", phone);
- resolver.update(uri, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2",id+""})
- }
相關推薦
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