① android 通訊錄 怎麼改聯系人
通過getContentResolver()得到ContentResolver
後,我們就可以通過該對象的delete,insert,updata,query等方法間接操作聯系人資料庫,那麼,如果我們刪除某些聯系人,以ContactsContract.RawContacts.CONTENT_URI為例,怎麼做,先來看下源碼:
首先,ContentResolver調用delete();刪除操作從紅色部分開始
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
waitForAccess();
return super.delete(uri, selection, selectionArgs);
}
上面的super.delete(uri, selection, selectionArgs)調用父親方法
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = 0;
boolean applyingBatch = applyingBatch();
if (!applyingBatch) {
mDb = mOpenHelper.getWritableDatabase();
mDb.beginTransactionWithListener(this);
try {
count = deleteInTransaction(uri, selection, selectionArgs);
if (count > 0) {
mNotifyChange = true;
}
mDb.setTransactionSuccessful();
} finally {
mDb.endTransaction();
}
onEndTransaction();
} else {
count = deleteInTransaction(uri, selection, selectionArgs);
if (count > 0) {
mNotifyChange = true;
}
}
return count;
}
父類回調deleteInTransaction(uri, selection, selectionArgs);刪除聯系人操作在這里進行。
//該方法對uri進行匹配來執行相應的刪除操作,並且是在事務中完成的,,比如
//content://com.android.contacts/contacts
//content://com.android.contacts/contacts/#
// .......................................................省略
@Override
protected int deleteInTransaction(Uri uri, String selection, String[] selectionArgs) {
.......................................................
.......................................................
//我們可以在uri中的authority部分可帶可選的參數ContactsContract.CALLER_IS_SYNCADAPTER
//比如uri字元串可以寫成content://com.android.contacts?ContactsContract.CALLER_IS_SYNCADAPTER=true
// ContactsContract.CALLER_IS_SYNCADAPTER默認是false的,他告訴同步適配器如何執行刪除操作。
//如果設置為true,則delete的時候直接刪除聯系人,否則,默認delete時是不會立即刪除RawContacts中的數據的,
//只是把RawContacts.DELETED標志位設置為1,從它的aggregate contact中移除該raw contact,即顯示聯系人時不顯示它的內容
//同步聯系人時,刪除伺服器上的raw contact,最終刪除手機上已
//標記為DELETED為1的raw contacts
final boolean callerIsSyncAdapter = readBooleanQueryParameter(uri, ContactsContract.CALLER_IS_SYNCADAPTER, false);
final int match = sUriMatcher.match(uri);
switch (match) {
.......................................................
.......................................................
.......................................................
case CONTACTS: {//uri為content://com.android.contacts/contacts,目錄(dir)類型
// TODO
return 0;
}
case CONTACTS_ID: {//刪除某一個聯系人,uri指定了ContactsContract.Contacts中的欄位contact_id,Item類型
long contactId = ContentUris.parseId(uri);//得到該給定聯系人數據集的id
return deleteContact(contactId);
}
.......................................................
.......................................................
.......................................................
case RAW_CONTACTS: {
int numDeletes = 0;
Cursor c = mDb.query(Tables.RAW_CONTACTS, new String[]{RawContacts._ID},
appendAccountToSelection(uri, selection), selectionArgs, null, null, null);
try {
while (c.moveToNext()) {
final long rawContactId = c.getLong(0);
numDeletes += deleteRawContact(rawContactId, callerIsSyncAdapter);
}
} finally {
c.close();
}
return numDeletes;
}
case RAW_CONTACTS_ID: {
final long rawContactId = ContentUris.parseId(uri);
return deleteRawContact(rawContactId, callerIsSyncAdapter);
}
case DATA: {
mSyncToNetwork |= !callerIsSyncAdapter;
return deleteData(appendAccountToSelection(uri, selection), selectionArgs,
callerIsSyncAdapter);
}
case DATA_ID:
case PHONES_ID:
case EMAILS_ID:
case POSTALS_ID: {
long dataId = ContentUris.parseId(uri);
mSyncToNetwork |= !callerIsSyncAdapter;
return deleteData(Data._ID + "=" + dataId, null, callerIsSyncAdapter);
}
.......................................................
.......................................................
.......................................................
}
}
public int deleteRawContact(long rawContactId, boolean callerIsSyncAdapter) {
if (callerIsSyncAdapter) {
mDb.delete(Tables.PRESENCE, PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null);
//直接刪除數據
return mDb.delete(Tables.RAW_CONTACTS, RawContacts._ID + "=" + rawContactId, null);
} else {
//從他關聯的aggregate contact移除該數據
mDbHelper.removeContactIfSingleton(rawContactId);
//標記為已刪除,但不是立即刪除數據
return markRawContactAsDeleted(rawContactId);
}
}
綜上,我們要刪除聯系人可以這樣做:
1)刪除單個聯系人:
CR.delete(ContactsContract.RawContacts.CONTENT_URI,ContactsContract.RawContacts_id + "=" + delRawId);
2)刪除全部聯系人:
getContentResolver().delete(Uri.parse(ContactsContract.RawContacts.CONTENT_URI.toString() +"?" + ContactsContract.CALLER_IS_SYNCADAPTER+"=true"), ContactsContract.RawContacts._ID + ">0", null));
數據索引從1開始,所以只要id>0就可以全部刪除raw contact記錄,上面的刪除操作是立即進行的,因為我們設置了true.
② android編程,如何刪除通訊錄中的聯系人
手機刪除聯系人的方法:
方式1:聯系人-右上角三個點圖標-刪除-勾選要刪除的聯系人-刪除(左上角可全選)。
方式2:聯系人-長按住某個聯系人-刪除。
③ android怎麼刪除所有聯系人
如果你不想刪除掉手機中安裝的軟體,那麼你也可以只將手機中的聯系人等個人PIM信息刪除。
下面就是具體的操作方法:
依次點擊「設置」——「應用程序」——「管理應用程序」——「Contacts
Storage」——「清除數據」。
然後進入綁定的Gmail賬號中,將其中的手機聯系人全部刪除
④ android編程,怎麼刪除通訊錄中的聯系人
android聯系人是使用內嵌套的資料庫進行保存的,所有隻要在資料庫中找到相應的ID就可以進行刪除了。
java">CursorcontactsCur=cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
while(contactsCur.moveToNext()){
//獲取ID
StringrawId=contactsCur.getString(contactsCur.getColumnIndex(ContactsContract.Contacts._ID));
//刪除
Stringwhere=ContactsContract.Data._ID+"=?";
String[]whereparams=newString[]{rawId};
getContentResolver().delete(ContactsContract.RawContacts.CONTENT_URI,where,whereparams);
}
⑤ Android 聯系人資料庫介紹以及對聯系人的基本操作
您好,很高興為您解答。
一、 聯系人資料庫
聯系人的資料庫文件的位置
/data/data/com.android.providers.contacts/databases.contacts2.db
資料庫中重要的幾張表
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列保存號碼類型(手機號碼/家庭號碼/工作號碼等)。
二、對聯系人的基本操作
這里的基本操作只是針對手機測的聯系人,(U)SIM側的聯系人的操
作後續介紹。
如果對聯系人的基本操作,我們必須得到許可。
方法就是在AndroidManifest.xml文件中配置如下許可權:
<uses-permissionandroid:name="android.permission.READ_CONTACTS"
/>
<uses-permissionandroid:name="android.permission.WRITE_CONTACTS"
/>
讀取聯系人
分為以下步驟:
1、先讀取contacts表,獲取ContactsID;
2、再在raw_contacts表中根據ContactsID獲取RawContactsID;
3、然後就可以在data表中根據RawContactsID獲取該聯系人的各數據了。
//獲取用來操作數據的類的對象,對聯系人的基本操作都是使用這個對象
ContentResolvercr=getContentResolver();
//查詢contacts表的所有記錄
Cursorcur=cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,
null,null);
//如果記錄不為空
if(cur.getCount()>0)
{
//游標初始指向查詢結果的第一條記錄的上方,執行moveToNext函數會判斷
//下一條記錄是否存在,如果存在,指向下一條記錄。否則,返回false。
while(cur.moveToNext())
{
StringrawContactsId="";
Stringid=
cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
str+="ID:"+id+" ";二、對聯系人的基本操作(4)
//讀取rawContactsId
CursorrawContactsIdCur=cr.query(RawContacts.CONTENT_URI,
null,
RawContacts.CONTACT_ID+"=?",
newString[]{id},null);
//該查詢結果一般只返回一條記錄,所以我們直接讓游標指向第一條記錄
if(rawContactsIdCur.moveToFirst())
{
//讀取第一條記錄的RawContacts._ID列的值
rawContactsId=
rawContactsIdCur.getString(rawContactsIdCur.getColumnIndex(
RawContacts._ID));
}
rawContactsIdCur.close();
//讀取號碼
If(Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.
Contacts.HAS_PHONE_NUMBER)))>0)
{
//根據查詢RAW_CONTACT_ID查詢該聯系人的號碼
CursorPhoneCur=
cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID+"=
?",
newString[]{rawContactsId},null);
//上面的ContactsContract.CommonDataKinds.Phone.CONTENT_URI
//可以用下面的phoneUri代替
//UriphoneUri=Uri.parse("content://com.android.contacts/data/phones");二、對聯系人的基本操作(6)
//一個聯系人可能有多個號碼,需要遍歷
while(PhoneCur.moveToNext())
{
//號獲取碼
Stringnumber=
PhoneCur.getString(PhoneCur.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER));
//獲取號碼類型
StringnumberType=
PhoneCur.getString(PhoneCur.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.TYPE));
}
PhoneCur.close();
新建聯系人
新建聯系人時, 根據contacts、raw_ contacts兩張表中ID的使用情況,自動
生成ContactID和RawContactID。
Android源碼新建重復姓名的聯系人的ContactID是不重復的,所以會重復顯
示。
用下面的代碼新建聯系人,如果多次新建的聯系人的姓名是一樣的,生成的
ContactID也會重復,RawContactID不會重復,我們在讀取聯系人的時候可
以獲取所有同姓名聯系人的號碼等信息,在顯示聯系人的時候,重復姓名的
聯系人的所有欄位信息都會合並起來顯示為一個聯系人。
ContentValuesvalues=newContentValues();
UrirawContactUri=
getContentResolver().insert(RawContacts.CONTENT_URI,values);
longrawContactId=ContentUris.parseId(rawContactUri);二、對聯系人的基本操作(8)
//向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);
}
刪除聯系人
我們只需要將raw_contacts表中指定RawContactID的
行刪除,其他表中與之關聯的數據都會自動刪除。
publicvoiddelete(longrawContactId)
{
getContentResolver().delete(ContentUris.withAppendedId(RawContac
ts.CONTENT_URI,rawContactId),null,null);
}
更新聯系人
聯系人的所有信息都是保存在data表中,所以要更新聯系人,我們只需要根
據RawContactID和MIMETYPE修改data表中的內容。
ContentValuesvalues=newContentValues();
values.put(Phone.NUMBER,「123");
values.put(Phone.TYPE,Phone.TYPE_MOBILE);
StringWhere=ContactsContract.Data.RAW_CONTACT_ID+"=?AND
"+ContactsContract.Data.MIMETYPE+"=?";
String[]WhereParams=newString[]{"5",Phone.CONTENT_ITEM_TYPE};
getContentResolver().update(ContactsContract.Data.CONTENT_URI,
values,Where,WhereParams);
如若滿意,請點擊右側【採納答案】,如若還有問題,請點擊【追問】
希望我的回答對您有所幫助,望採納!
~O(∩_∩)O~
⑥ 安卓手機怎麼批量刪除聯系人 手機知道
步驟
1、打開手機找到手機通話並點擊
⑦ android 怎樣徹底刪除聯系人,該如何處理
先說比較常規的方法。
很多手機的聯系人程序自帶刪除功能。以華為EMUI2.3為例,打開聯系人,可以看到右下角有三個點,這個相當於其他手機的「設置」
點擊【設置】,可以看到刪除選項,然後選擇刪除,可以勾選「全部」,然後果斷刪除即可。
安卓手機通用刪除法
有的rom為了防止誤刪,可能會不支持上面批量刪除的方法,這就要用這第二種方法了。
打開手機【設置】-【管理應用程序】。其他手機這一功能的命名大同小異,一般都是應用程序、應用程序設置之類的名字。
往右找到「全部」,然後往下滑找到【聯系人存儲】。
注意,是聯系人存儲,而不是聯系人。
進入聯系人存儲之後,點擊「清除數據」