publicstaticfinalclass
ContactsContract.RawContacts
extendsObject
implementsBaseColumnsContactsContract.ContactOptionsColumnsContactsContract.RawContactsColumnsContactsContract.SyncColumns
java.lang.Object
android.provider.ContactsContract.RawContacts
ClassOverview
Constantsfortherawcontactstable,
whichcontainsonerowofcontactinformationforeachpersonineachsyncedaccount.
rawcontact就对应一个联系人
SyncadaptersandcontactmanagementappsaretheprimaryconsumersofthisAPI.
Aggregation
Assoonasarawcontactisinsertedorwheneveritsconstituentdatachanges,
theproviderwillcheckiftherawcontactmatchesotherexistingrawcontactsandifsowillaggregateitwiththose.
TheaggregationisreflectedintheContactsContract.RawContactstablebythechangeoftheCONTACT_IDfield,
whichisthereferencetotheaggregatecontact.
Changestothestructuredname,organization,phonenumber,emailaddress,ornicknametriggerare-aggregation.
参照Contact类的描述
AContactcannotbecreatedexplicitly.
Whenarawcontactisinserted,theproviderwillfirsttrytofindaContactrepresentingthesameperson.
Ifoneisfound,therawcontact'sCONTACT_IDcolumngetsthe_IDoftheaggregateContact
.Ifnomatchisfound,theproviderautomaticallyinsertsanewContactandputsits_IDintotheCONTACT_IDcolumnofthenewlyinsertedrawcontact.
大概可以得出rawcontact和组(contact)的匹配过程:
当rawcontact被插入或时,系统就会检查是否可以把该rawcontact加到已经有的组(contact)。
如果找到可以加入的组,就把组ID写到rawcontact的CONTACT_ID这个数据项中。
如果没找到就由系统重新创建一组,并把组ID写到rawcontact的CONTACT_ID这个数据项中。
如果rawcontact的structuredname,organization,phonenumber,emailaddress,ornickname被改变。
系统就会检查rawcontact是否还属于rawcontact的CONTACT_ID标记的那个组。
如果发现rawcontact不属于rawcontact的CONTACT_ID标记的那个组。
那么系统就会找是否可以把该rawcontact加到已经有的其他组(contact)
如果找到可以加入的组,就把组ID写到rawcontact的CONTACT_ID这个数据项中。
如果没找到就由系统重新创建一组,并把组ID写到rawcontact的CONTACT_ID这个数据项中。
注意:这的组是指contact(Aggregationofrawcontact)
关于分组机制的编程可参考类ContactsContract.AggregationExceptions.
一个rawcontact的信息主要由主表(rawcontact类声明的数据列),多项子表数据ContactsContract.Data来进行表示。
子表数据可以通过设置MIMETYPE项的值来表示多种类型的数据。
比如通过设置MIMETYPE项为StructuredName.CONTENT_ITEM_TYPE来说明是StructuredName数据。
当然对于DATA1~DATA15也要按照StructuredName中定义的数据格式来写入数据。
子表数据可以是
*StructuredName.CONTENT_ITEM_TYPE
*Phone.CONTENT_ITEM_TYPE
*Email.CONTENT_ITEM_TYPE
*Photo.CONTENT_ITEM_TYPE
*Organization.CONTENT_ITEM_TYPE
*Im.CONTENT_ITEM_TYPE
*Nickname.CONTENT_ITEM_TYPE
*Note.CONTENT_ITEM_TYPE
*StructuredPostal.CONTENT_ITEM_TYPE
*GroupMembership.CONTENT_ITEM_TYPE
*Website.CONTENT_ITEM_TYPE
*Event.CONTENT_ITEM_TYPE
*Relation.CONTENT_ITEM_TYPE
ContactsContract.RawContacts
extendsObject
implementsBaseColumnsContactsContract.ContactOptionsColumnsContactsContract.RawContactsColumnsContactsContract.SyncColumns
java.lang.Object
android.provider.ContactsContract.RawContacts
ClassOverview
Constantsfortherawcontactstable,
whichcontainsonerowofcontactinformationforeachpersonineachsyncedaccount.
rawcontact就对应一个联系人
SyncadaptersandcontactmanagementappsaretheprimaryconsumersofthisAPI.
Aggregation
Assoonasarawcontactisinsertedorwheneveritsconstituentdatachanges,
theproviderwillcheckiftherawcontactmatchesotherexistingrawcontactsandifsowillaggregateitwiththose.
TheaggregationisreflectedintheContactsContract.RawContactstablebythechangeoftheCONTACT_IDfield,
whichisthereferencetotheaggregatecontact.
Changestothestructuredname,organization,phonenumber,emailaddress,ornicknametriggerare-aggregation.
参照Contact类的描述
AContactcannotbecreatedexplicitly.
Whenarawcontactisinserted,theproviderwillfirsttrytofindaContactrepresentingthesameperson.
Ifoneisfound,therawcontact'sCONTACT_IDcolumngetsthe_IDoftheaggregateContact
.Ifnomatchisfound,theproviderautomaticallyinsertsanewContactandputsits_IDintotheCONTACT_IDcolumnofthenewlyinsertedrawcontact.
大概可以得出rawcontact和组(contact)的匹配过程:
当rawcontact被插入或时,系统就会检查是否可以把该rawcontact加到已经有的组(contact)。
如果找到可以加入的组,就把组ID写到rawcontact的CONTACT_ID这个数据项中。
如果没找到就由系统重新创建一组,并把组ID写到rawcontact的CONTACT_ID这个数据项中。
如果rawcontact的structuredname,organization,phonenumber,emailaddress,ornickname被改变。
系统就会检查rawcontact是否还属于rawcontact的CONTACT_ID标记的那个组。
如果发现rawcontact不属于rawcontact的CONTACT_ID标记的那个组。
那么系统就会找是否可以把该rawcontact加到已经有的其他组(contact)
如果找到可以加入的组,就把组ID写到rawcontact的CONTACT_ID这个数据项中。
如果没找到就由系统重新创建一组,并把组ID写到rawcontact的CONTACT_ID这个数据项中。
注意:这的组是指contact(Aggregationofrawcontact)
关于分组机制的编程可参考类ContactsContract.AggregationExceptions.
一个rawcontact的信息主要由主表(rawcontact类声明的数据列),多项子表数据ContactsContract.Data来进行表示。
子表数据可以通过设置MIMETYPE项的值来表示多种类型的数据。
比如通过设置MIMETYPE项为StructuredName.CONTENT_ITEM_TYPE来说明是StructuredName数据。
当然对于DATA1~DATA15也要按照StructuredName中定义的数据格式来写入数据。
子表数据可以是
*StructuredName.CONTENT_ITEM_TYPE
*Phone.CONTENT_ITEM_TYPE
*Email.CONTENT_ITEM_TYPE
*Photo.CONTENT_ITEM_TYPE
*Organization.CONTENT_ITEM_TYPE
*Im.CONTENT_ITEM_TYPE
*Nickname.CONTENT_ITEM_TYPE
*Note.CONTENT_ITEM_TYPE
*StructuredPostal.CONTENT_ITEM_TYPE
*GroupMembership.CONTENT_ITEM_TYPE
*Website.CONTENT_ITEM_TYPE
*Event.CONTENT_ITEM_TYPE
*Relation.CONTENT_ITEM_TYPE
注:关于子表每种类型的具体数据格式都android.provider.ContactsContract.
CommonDataKinds包中相关类找到说明。比如Email是在CommonDataKinds.Email中.
主表数据共18项:
变量名列名备注
_ID_id这个就是raw_contact_id
CONTACT_IDcontact_id
AGGREGATION_MODEaggregation_mode分组模式
DELETEDdeleted是否已经被删除
TIMES_CONTACTEDtimes_contacted
LAST_TIME_CONTACTEDlast_time_contacted
STARREDstarred
CUSTOM_RINGTONEcustom_ringtone 来电铃声的Url
SEND_TO_VOICEMAILsend_to_voicemail
ACCOUNT_NAMEaccount_name
ACCOUNT_TYPEaccount_type
SOURCE_IDsourceid
VERSIONversion
DIRTYdirty
SYNC1~SYNC1sync1~sync2
注意1:_ID就是raw_contact_id
注意2:当我们查询时,通常是查询没有删除的联系人。所以要加上条件RawContacts.DELETED==0:
RawContacts.DELETED+"=?",newString[]{String.valueOf(0)}
注意3:主表中没有名字的信息.名字在子表StructuredName中。
子表数据共有25项:
变量名列名备注
_ID_id
MIMETYPEmimetype
RAW_CONTACT_IDraw_contact_id
IS_PRIMARYis_primary
IS_SUPER_PRIMARYis_super_primary
DATA_VERSIONdata_version
DATA1~DATA15data1~data15
SYNC1~SYNC4data_sync1~data_sync4一,数据插入可以参考《rawcontact数据插入》
二,数据查询可以参考《rawContact数据查询》
三,数据更新:
finalintupdate(Uriuri,ContentValuesvalues,Stringwhere,String[]selectionArgs)
Updaterow(s)inacontentURI.
其使用很简单。
ContentValuesvalues可以参考《 rawContact数据插入》
Stringwhere,String[]selectionArgs可以参考《 rawContact数据查询》
主表数据共18项:
变量名列名备注
_ID_id这个就是raw_contact_id
CONTACT_IDcontact_id
AGGREGATION_MODEaggregation_mode分组模式
DELETEDdeleted是否已经被删除
TIMES_CONTACTEDtimes_contacted
LAST_TIME_CONTACTEDlast_time_contacted
STARREDstarred
CUSTOM_RINGTONEcustom_ringtone 来电铃声的Url
SEND_TO_VOICEMAILsend_to_voicemail
ACCOUNT_NAMEaccount_name
ACCOUNT_TYPEaccount_type
SOURCE_IDsourceid
VERSIONversion
DIRTYdirty
SYNC1~SYNC1sync1~sync2
注意1:_ID就是raw_contact_id
注意2:当我们查询时,通常是查询没有删除的联系人。所以要加上条件RawContacts.DELETED==0:
RawContacts.DELETED+"=?",newString[]{String.valueOf(0)}
注意3:主表中没有名字的信息.名字在子表StructuredName中。
子表数据共有25项:
变量名列名备注
_ID_id
MIMETYPEmimetype
RAW_CONTACT_IDraw_contact_id
IS_PRIMARYis_primary
IS_SUPER_PRIMARYis_super_primary
DATA_VERSIONdata_version
DATA1~DATA15data1~data15
SYNC1~SYNC4data_sync1~data_sync4一,数据插入可以参考《rawcontact数据插入》
二,数据查询可以参考《rawContact数据查询》
三,数据更新:
finalintupdate(Uriuri,ContentValuesvalues,Stringwhere,String[]selectionArgs)
Updaterow(s)inacontentURI.
其使用很简单。
ContentValuesvalues可以参考《 rawContact数据插入》
Stringwhere,String[]selectionArgs可以参考《 rawContact数据查询》
主表更新也可以用批量进行
Rawcontactscanbeupdatedincrementallyorinabatch.
Batchmodeshouldbeusedwheneverpossible.
Theproceduresandconsiderationsareanalogoustothosedocumentedaboveforinserts.
子表更新也可以用批量进行
Justaswithinsert,updatecanbedoneincrementallyorasabatch,thebatchmodebeingthepreferredmethod:
ArrayList<ContentProviderOperation>ops=Lists.newArrayList();
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(Data._ID+"=?",newString[]{String.valueOf(dataId)})
.withValue(Email.DATA,"somebody@android.com")
.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);
四,数据删除。
主表删除:
getContentResolver().delete(RawContacts.CONTENT_URI,null,null);
注意:这里会除了会删除主表,也会把相应的子表删除掉。
子表删除
getContentResolver().delete(Data.CONTENT_URI,null,null)
也可以批量删除
Justaswithinsertandupdate,deletioncanbedoneeitherusingthedelete(Uri,String,String[])method
orusingaContentProviderOperation:
ArrayList<ContentProviderOperation>ops=Lists.newArrayList();
ops.add(ContentProviderOperation.newDelete(Data.CONTENT_URI)
.withSelection(Data._ID+"=?",newString[]{String.valueOf(dataId)})
.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);
Rawcontactscanbeupdatedincrementallyorinabatch.
Batchmodeshouldbeusedwheneverpossible.
Theproceduresandconsiderationsareanalogoustothosedocumentedaboveforinserts.
子表更新也可以用批量进行
Justaswithinsert,updatecanbedoneincrementallyorasabatch,thebatchmodebeingthepreferredmethod:
ArrayList<ContentProviderOperation>ops=Lists.newArrayList();
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(Data._ID+"=?",newString[]{String.valueOf(dataId)})
.withValue(Email.DATA,"somebody@android.com")
.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);
四,数据删除。
主表删除:
getContentResolver().delete(RawContacts.CONTENT_URI,null,null);
注意:这里会除了会删除主表,也会把相应的子表删除掉。
子表删除
getContentResolver().delete(Data.CONTENT_URI,null,null)
也可以批量删除
Justaswithinsertandupdate,deletioncanbedoneeitherusingthedelete(Uri,String,String[])method
orusingaContentProviderOperation:
ArrayList<ContentProviderOperation>ops=Lists.newArrayList();
ops.add(ContentProviderOperation.newDelete(Data.CONTENT_URI)
.withSelection(Data._ID+"=?",newString[]{String.valueOf(dataId)})
.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);