Android手機通訊錄的讀取、新增、刪除、查詢
Android聯絡人資料庫檔案(contact2.db)
有研究過手機通訊錄資料的童鞋肯定知道一個數據庫檔案:目前是contact2.db(哥的手機是Android4.04的)
在此路徑下可以找到:/data/data/com.android.providers.contacts/databases/contact2.db
將其匯入視覺化資料庫管理器當中(我這裡用的是SQLiteDatabase Browser)
有以上那麼多張表,看到頭暈的有木有,我們主要關注一些比較重要的表就行了。
以上我用紅框標誌的是比較重要的幾個表:
1、contacts表
該表儲存了所有的手機測聯絡人,每個聯絡人佔一行,該表儲存了聯絡人的ContactID、聯絡次數、最後一次聯絡的時間、是否含有號碼、是否被新增到收藏夾等資訊。
2、raw_contacts表
該表儲存了所有建立過的手機測聯絡人,每個聯絡人佔一行,表裡有一列標識該聯絡人是否被刪除,該表儲存了兩個ID: RawContactID和ContactID,從而將contacts表和raw_contacts表聯絡起來。該表儲存了聯絡人的RawContactID、ContactID、聯絡次數、最後一次聯絡的時間、是否被新增到收藏夾、顯示的名字、用於排序的漢語拼音等資訊。
3、 mimetypes 表
該表定義了所有的MimeTypeID,即聯絡人的各個欄位的唯一標誌。
4、data表
? 該表儲存了所有建立過的手機測聯絡人的所有資訊,每個欄位佔一行 ,該表儲存了兩個ID: MimeTypeID和RawContactID,從而將data表和raw_contacts表聯絡起來。
? 聯絡人的所有資訊儲存在列data1至data15中,各列中儲存的內容根據MimeTypeID的不同而不同。如儲存號碼(MimeTypeID=5)的那行資料中,data1列儲存號碼,data2列儲存號碼型別(手機號碼/家庭號碼/工作號碼等)。
對聯絡人的基本操作(增刪改查)
許可權設定
讀取聯絡人
分為以下步驟:
1、先讀取contacts表,獲取ContactsID;
2、再在raw_contacts表中根據ContactsID獲取RawContactsID;
3、然後就可以在data表中根據RawContactsID獲取該聯絡人的各資料了。
- private
- // 獲取用來操作資料的類的物件,對聯絡人的基本操作都是使用這個物件
- ContentResolver cr = getContentResolver();
- // 查詢contacts表的所有記錄
- Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
- null, null, null);
- // 如果記錄不為空
- if (cursor.getCount() > 0) {
- // 遊標初始指向查詢結果的第一條記錄的上方,執行moveToNext函式會判斷
- // 下一條記錄是否存在,如果存在,指向下一條記錄。否則,返回false。
- while (cursor.moveToNext()) {
- String rawContactId = "";
- // 從Contacts表當中取得ContactId
- String id = cursor.getString(cursor
- .getColumnIndex(ContactsContract.Contacts._ID));
- Log.v("contactID", id);
- // 獲取RawContacts表的遊標
- Cursor rawContactCur = cr.query(RawContacts.CONTENT_URI, null,
- RawContacts._ID + "=?", new String[] { id }, null);
- // 該查詢結果一般只返回一條記錄,所以我們直接讓遊標指向第一條記錄
- if (rawContactCur.moveToFirst()) {
- // 讀取第一條記錄的RawContacts._ID列的值
- rawContactId = rawContactCur.getString(rawContactCur
- .getColumnIndex(RawContacts._ID));
- Log.v("rawContactID", rawContactId);
- }
- // 關閉遊標
- rawContactCur.close();
- // 讀取號碼
- if (Integer
- .parseInt(cursor.getString(cursor
- .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
- // 根據查詢RAW_CONTACT_ID查詢該聯絡人的號碼
- Cursor phoneCur = cr
- .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
- null,
- ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID
- + "=?",
- new String[] { rawContactId }, null);
- // 上面的ContactsContract.CommonDataKinds.Phone.CONTENT_URI
- // 可以用下面的phoneUri代替
- // Uri
- // phoneUri=Uri.parse("content://com.android.contacts/data/phones");
- // 一個聯絡人可能有多個號碼,需要遍歷
- while (phoneCur.moveToNext()) {
- // 獲取號碼
- String number = phoneCur
- .getString(phoneCur
- .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
- Log.v("number", number);
- // 獲取號碼型別
- String type = phoneCur
- .getString(phoneCur
- .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
- Log.v("type", type);
- }
- phoneCur.close();
- }
- }
- cursor.close();
- }
- }
新建聯絡人
新建聯絡人時, 根據contacts、raw_ contacts兩張表中ID的使用情況,自動生成ContactID和RawContactID。
Android原始碼新建重複姓名的聯絡人的ContactID是不重複的,所以會重複顯示。
用下面的程式碼新建聯絡人,如果多次新建的聯絡人的姓名是一樣的,生成的ContactID也會重複, RawContactID不會重複,我們在讀取聯絡人的時候可以獲取所有同姓名聯絡人的號碼等資訊,在顯示聯絡人的時候,重複姓名的聯絡人的所有欄位資訊都會合並起來顯示為一個聯絡人。
- publicvoid addContact(String name, String phoneNum) {
- ContentValues values = new ContentValues();
- Uri rawContactUri = getContentResolver().insert(
- RawContacts.CONTENT_URI, values);
- long rawContactId = ContentUris.parseId(rawContactUri);
- // 向data表插入資料
- if (name != "") {
- values.clear();
- values.put(Data.RAW_CONTACT_ID, rawContactId);
- values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
- values.put(StructuredName.GIVEN_NAME, name);
- getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
- values);
- }
- // 向data表插入電話號碼
- if (phoneNum != "") {
- values.clear();
- values.put(Data.RAW_CONTACT_ID, rawContactId);
- values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
- values.put(Phone.NUMBER, phoneNum);
- values.put(Phone.TYPE, Phone.TYPE_MOBILE);
- getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
- values);
- }
- }
刪除聯絡人
Android幫助文件:When a raw contact is deleted, all of its Data rows as well asStatusUpdates, AggregationExceptions, PhoneLookup rows are deleted automatically.
所以,要刪除聯絡人,我們只需要將raw_contacts表中指定RawContactID的行刪除,其他表中與之關聯的資料都會自動刪除。
- // 刪除聯絡人
- publicvoid deleteContact(long rawContactId) {
- getContentResolver().delete(
- ContentUris.withAppendedId(RawContacts.CONTENT_URI,
- rawContactId), null, null);
- }
更新聯絡人
聯絡人的所有資訊都是儲存在data表中,所以要更新聯絡人,我們只需要根據RawContactID和MIMETYPE修改data表中的內容。
- // 更新聯絡人
- publicvoid updataCotact(long rawContactId) {
- ContentValues values = new ContentValues();
- values.put(Phone.NUMBER, "13800138000");
- values.put(Phone.TYPE, Phone.TYPE_MOBILE);
- String where = ContactsContract.Data.RAW_CONTACT_ID + "=? AND "
- + ContactsContract.Data.MIMETYPE + "=?";
- String[] selectionArgs = new String[] { String.valueOf(rawContactId),
- Phone.CONTENT_ITEM_TYPE };
- getContentResolver().update(ContactsContract.Data.CONTENT_URI, values,
- where, selectionArgs);
- }
相關推薦
Android手機通訊錄的讀取、新增、刪除、查詢
Android聯絡人資料庫檔案(contact2.db) 有研究過手機通訊錄資料的童鞋肯定知道一個數據庫檔案:目前是contact2.db(哥的手機是Android4.04的) 在此路徑下可以找到:/data/data/com.android.providers.c
MySQL索引操作:建立、新增和刪除索引
如果對索引的作用不太瞭解的建議先閱讀上一篇博文:MySQL索引的作用和分類介紹 建立索引 建立表的時候建立索引 格式: CREATE TABLE 表名[欄位名 欄位型別] [UNIQUE|FULLTEXT|SPATIAL|...] [INDEX|K
MySQL中外來鍵的定義、作用、新增和刪除
1 簡介 在實際開發的專案中,一個健壯資料庫中的資料一定有很好的參照完整性。例如學生檔案和成績單兩張表,如果成績單中有張三的成績,學生檔案中張三的檔案卻被刪除了,這樣就會產生垃圾資料或者錯誤資料。為了保證資料的完整性,將兩張表之間的資料建立關係,因此就需要在成績
SQL_3th_T-SQL語句建立和刪除資料庫、新增和刪除約束
在SQL Server 2008 R2中點選新建查詢,輸入如下程式碼,選中程式碼段,並點選執行,就能執行選中區域程式碼: --使用數T-SQL語句來建立資料庫 create database Students on ( name='Students', --這是資料檔案的邏
Android 手機適配劉海(華為、vivo)
直接開始。 先看下鴻陽公眾號的上面文章:可以關注他,這裡只是方便自己記錄一下。 Android 劉海屏適配方案 一、vivo的劉海適配直接官方文件 (長螢幕) google 適配全面屏要求,必須在AndroidManifest.xml宣告一下meta-data,應用下可以全屏
Android 手機通訊錄開發時給聯絡人新增頭像失敗的坑
在給聯絡人新增頭像程式碼 Bitmap photo = ...; // 將 Bitmap 轉為 byte[] byte[] bytes = LshImageUtils.bitmap2Bytes(photo); // 新增聯絡人, 插入名字和頭像 (LshC
如何向android手機通訊錄中新增聯絡人
直接在手機的通訊錄的資料庫中新增列表 相關程式碼如下 package com.example.test; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import
在arcgis中提取、新增與刪除Shape檔案Z值
一、問題描述 有一批3d模型沒有高程值;在BS平臺上預覽顯示這些模型插入地下去了;預覽效果非常差,因為Z值為都是0; 由於平臺讀取資料是geometry的Z值欄位,而不是重新建一個欄位,所以要改寫ge
Android手機SD卡檔案或目錄拷貝、複製、貼上功能實現程式碼
package com.copy.file; /** * @author wainiwann * Android SD卡檔案目錄拷貝操作 * */ import java.io.File; import java.io.FileInputStream; import ja
Android中如何給TextView新增下劃線、設定不同字型和顏色
一、如何給TextView新增下劃線以及點選跳轉 String txt = "點選跳轉到百度"; SpannableString spannableString = new Span
python學習——修改、新增和刪除元素
在上週簡要的學習了一下python列表的一些操作,並做了做《python程式設計——從入門到實踐》第三章的一些例題。3-1、3-2names=['tony','tom','marry'] print(names[0]) print(names[1]) print(names[
面試題9:數組堆化、堆的插入、堆的刪除、堆排序
art 面試 rewind 刪除 test from minimum 面試題 排序 參考:白話經典算法系列之七 堆與堆排序 1 #include <iostream> 2 #include <climits> 3 #include <v
SQL SERVER 新增表、新增字段、修改字段 判斷表是否存在
相關信息 not null record begin hist char use size content // 新增之前判斷表是否存在 IF NOT EXISTS (SELECT NAME FROM SYSOBJECTS WHERE ID = OBJECT_ID(‘t
演算法導論 第十二章:二叉查詢樹 筆記(二叉查詢樹、查詢二叉查詢樹、插入和刪除、隨機構造的二叉查詢樹)
二叉查詢樹是一種樹資料結構,它與普通的二叉樹最大的不同就是二叉查詢樹滿足一個性質:對於樹中的任意一個節點,均有其左子樹中的所有節點的關鍵字值都不大於該節點的關鍵字值,其右子樹中的任意一個節點的關鍵字值都不小於該節點的關鍵字值。 在二叉查詢樹上可以進行搜尋、取最小值、取最大值、取指定節點的前驅
第一次嘗試用BaseRecyclerViewAdapterHelper實現上拉重新整理、載入更多、新增頭佈局、尾佈局等等功能
BaseRecyclerViewAdapterHelper 簡介: 減少重複 Adapter 程式碼 新增 Item 的點選事件,長按事件以及子控制元件的點選事件 新增頭部、尾部,下拉重新整理、上拉載入(上拉載入的5種載入更多動畫任你選擇,後期會新增更多的載入動畫)、沒有更多
C++類中單鏈表的實現(頭插、尾插、頭刪、尾刪、指定位置插入、指定位置刪除、連結串列長度、清空連結串列、連結串列排序)
#include<iostream> using namespace std; class Node { public:Node():next(NULL){}Node(int n,Node *p = NULL):value(n),next(p){}int val
table表格的相關設定(邊框合併、隔行變色、新增內邊框、單獨設定某一列)
1、為table表格設定邊框合併 table{ border-collapse:collapse; border-spacing:0; } 2、隔行變色和新增內邊框 function addColor() { var tbodyTrList = $(
Notification(Notification的通知欄常駐、各種樣式、點選無效、禁止滑動刪除、相容低版本)
Notification(Notification的通知欄常駐、Notification的各種樣式、Notification點選無效、Notification禁止滑動刪除) Android的Notification是android系統中很重要的一個機制, 產品人員常常利用通
Linux筆記:禁止root賬號遠端登入、新增swap分割槽、修改ulimit
新裝ubuntu需要執行的幾個操作:1.修改sshd預設埠,禁止root登入sudo vi /etc/ssh/sshd_config將PermitRootLogin 設定為No --表示禁止root遠端登入將Port 修改為2222sudo service sshd
Scala——類的定義、重新實現toString方法、檢查先決條件、新增欄位、私有方法、自指向、輔助構造器、操作符、過載、隱式轉換
/** * Created by jiaoshuhai on 2018/4/23. *///類的建立class Rational(n:Int,d:Int){//類引數,oject無引數 //檢察先決條件 require(d != 0) private def gcd(a : Int ,b :Int) :