name="android.permission.READ_CONTACTS"/>
QueryingTheAndroidContactDatabase
RetrievingContactDetails
BasiccontactinformationstoredinContactstablewithdetailedinformationstoredinindividualtablesfornormalization.InAndroid2.0toquerythebasecontactrecordstheURItoqueryisstoredinContactsContract.Contacts.CONTENT_URI.
packagehigherpass.TestContacts;
importandroid.app.Activity;
importandroid.content.ContentResolver;
importandroid.database.Cursor;
importandroid.os.Bundle;
importandroid.provider.ContactsContract;
publicclassTestContactsextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ContentResolvercr=getContentResolver();
Cursorcur=cr.query(ContactsContract.Contacts.CONTENT_URI,
null,null,null,null);
if(cur.getCount()>0){
while(cur.moveToNext()){
Stringid=cur.getString(
cur.getColumnIndex(ContactsContract.Contacts._ID));
Stringname=cur.getString(
cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if(Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))>0){
//Queryphonehere.Coverednext
}
}
}
}
}
ThisapplicationstartsoffasanyotherAndroidapplication.FirstcreateaContentResolverisntanceincr.ThenusetheContentResolverinstancetoquerythedatabaseandreturnaCursorwiththecontactslist.ThequeryisperofrmedagainsttheURIstoredinContactsContract.Contacts.CONTENT_URI.Nextcheckifthecursorcontainsrecordsandifsoloopthroughthem.TherecordIDfieldisstoredintheidvariable.Thiswillbeusedasawhereparameterlater.Alsothedisplaynamefieldisstoredinthestringname.Formoredetailsaboutworkingwithcursorssee AndroidCursorsTutorial.
PhoneNumbers
Phonenumbersarestoredintheirowntableandneedtobequeriedseparately.ToquerythephonenumbertableusetheURIstoredintheSDKvariableContactsContract.CommonDataKinds.Phone.CONTENT_URI.UseaWHEREconditionaltogetthephonenumbersforthespecifiedcontact.
if(Integer.parseInt(cur.getString(
cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))>0){
CursorpCur=cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"=?
",
newString[]{id},null);
while(pCur.moveToNext()){
//Dosomethingwithphones
}
pCur.close();
}
PerformasecondqueryagainsttheAndroidcontactsSQLitedatabase.ThephonenumbersarequeriedagainsttheURIstoredinContactsContract.CommonDataKinds.Phone.CONTENT_URI.ThecontactIDisstoredinthephonetableasContactsContract.CommonDataKinds.Phone.CONTACT_IDandtheWHEREclauseisusedtolimitthedatareturned.
EmailAddresses
Queryingemailaddressesissimilartophonenumbers.Aquerymustbeperformedtogetemailaddressesfromthedatabase.QuerytheURIstoredinContactsContract.CommonDataKinds.Email.CONTENT_URItoquerytheemailaddresstable.
CursoremailCur=cr.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID+"=?
",
newString[]{id},null);
while(emailCur.moveToNext()){
//Thiswouldallowyougetseveralemailaddresses
//iftheemailaddresseswerestoredinanarray
Stringemail=emailCur.getString(
emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
StringemailType=emailCur.getString(
emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
}
emailCur.close();
AswiththephonequerythefieldnamesfortheemailtablearealsostoredunderContactsContract.CommonDataKinds.TheemailqueryisperformedontheURIinContactsContract.CommonDataKinds.Email.CONTENT_URIandtheWHEREclausehastomatchtheContactsContract.CommonDataKinds.Email.CONTACT_IDfield.SincemultipleemailaddressescanbestoredloopthroughtherecordsreturnedintheCursor.
Notes
Customnotescanbeattachedtoeachcontactrecord.AsbeforethesearestoredinaseparatetableandarerelatedbasedonthecontactID.
StringnoteWhere=ContactsContract.Data.CONTACT_ID+"=?
AND"+ContactsContract.Data.MIMETYPE+"=?
";
String[]noteWhereParams=newString[]{id,
ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE};
CursornoteCur=cr.query(ContactsContract.Data.CONTENT_URI,null,noteWhere,noteWhereParams,null);
if(noteCur.moveToFirst()){
Stringnote=noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
}
noteCur.close();
NotesarestoredintheAndroidContactsgenericdatatable.WhenaccessingspecificdatatheWHEREclausewillneed2conditionals.FirstthestandardcontactID,secondaMIMETYPEforthedatathatisbeingrequested.TheAndroidSDKcomeswithaseriesofauto-generatedvariablesthattakecareofthis.UsetheContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPEvariabletolimitthequerytonoterecords.ThedatatableURIisstoredatContactsContract.Data.CONTENT_URI.FinallythenotefieldnameisstoredinContactsContract.CommonDataKinds.Note.NOTE.
PostalAddresses
Androidcanstoremultiplepostaladdressespercontact.AddressesarealsostoredinthedatatablelikenotesandqueriedviatheURIstoredinContactsContract.Data.CONTENT_URI.SimilartothenotesqueryaMIMETYPEmustbeaddedtotheWHEREconditional.AlsoinAndroid2.0theAddressrecordwassplitintomultiplefieldscontainingdifferentpartsoftheaddress(PO-Box,stree,city,region,postalcode).InearlierversionsoftheAndroidSDKthiswasafree-formstringstorage.
StringaddrWhere=ContactsContract.Data.CONTACT_ID+"=?
AND"+ContactsContract.Data.MIMETYPE+"=?
";
String[]addrWhereParams=newString[]{id,
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE};
CursoraddrCur=cr.query(ContactsContract.Data.CONTENT_URI,
null,where,whereParameters,null);
while(addrCur.moveToNext()){
StringpoBox=addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
Stringstreet=addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
Stringcity=addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
Stringstate=addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
StringpostalCode=addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
Stringcountry=addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
Stringtype=addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
}
addrCur.close();
Thiscodeissimilartothepreviousexample.NoticethefieldnamesfortheaddresspiecesarestoredinContactsContract.CommonDataKinds.StructuredPostal.
InstantMessenger(IM)
Theinstantmessengerqueryperformsjustasthenotesandaddressqueries.ImportantfieldnamesforIMrelateddataarestoredinContactsContract.CommonDataKinds.Im.
StringimWhere=ContactsContract.Data.CONTACT_ID+"=?
AND"+ContactsContract.Data.MIMETYPE+"=?
";
String[]imWhereParams=newString[]{id,
ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE};
CursorimCur=cr.query(ContactsContract.Data.CONTENT_URI,
null,imWhere,imWhereParams,null);
if(imCur.moveToFirst()){
StringimName=imCur.getString(
imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));
StringimType;
imType=imCur.getString(
imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE));
}
imCur.close();
Organizations
ThelastpartofthecontactrecordtobecoveredistheOrganizationsdata.TheAndroidcontactrecordcancontaininformationaboutEmployment,professional,andsocialmembershipsaswellasrolesandtitles.TheserecordsarequeriedfromtheURIstoredinContactsContract.Data.CONTENT_URI.ImportantfieldnamesfortheorganizationdataarestoredinContactsContract.CommonDataKinds.Organization.
StringorgWhere=ContactsContract.Data.CONTACT_ID+"=?
AND"+ContactsContract.Data.MIMETYPE+"=?
";
String[]orgWhereParams=newString[]{id,
ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE};
CursororgCur=cr.query(ContactsContract.Data.CONTENT_URI,
null,orgWhere,orgWhereParams,null);
if(orgCur.moveToFirst()){
StringorgName=orgCur.getString(orgCur.getColumn