2012/03/05

[Android] 連絡先の取得


getContentResolver()を使用する。


android.database.Cursor c = getContentResolver().query(
 Data.CONTENT_URI,
 new String[]{...}, //取得するColumnを指定。 nullだと全Column
 ".....", //where句に該当、条件を指定しない場合はnull
 new String[]{...}, //プレースホルダに設定する値。上記where句の?に順にセットされる
 "....." //ORDER BY句。nullだと順序を指定しない。
);


getContentResolverメソッドはandroid.content.ContextWrapperクラスに定義されていて、 android.app.ActivityはContextWrapperを継承している。


取得例 [http://developer.android.com/intl/ja/reference/android/provider/ContactsContract.Data.html]
Cursor c = getContentResolver().query(Data.CONTENT_URI,
 new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL},
 Data.CONTACT_ID + "=?" + " AND "
  + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'",
 new String[] {String.valueOf(contactId)},
 null);



アプリケーションでContactへの参照を保持する場合は、android.provider.ContactsConstract.Contacts.LOOKUP_KEYを使用する。

//String lookupKey <- 保持しているLOOKUP_KEY
//lookupKeyからURIを組み上げる
android.net.Uri lookupUri = Uri.withAppendedPath(Contents.CONTENT_LOOKUP_URI, lookupKey);

//URIからContactを取得
android.database.Cursor c = getContentResolver().query(
 lookupUri, new String[]{ Contacts.DISPLAY_NAME }, ....
);

try{
 c.moveToFirst();
 String displayName = c.getString(0);
}finally{
 c.close();
}



パフォーマンスに配慮するなら、LOOKUP_KEYのほかにCONTACT_IDを保持し、 android.provider.ContactsConstract.Contacts.getLookupUri()を使用して URIを取得する。


getLookupUri()では、最初に CONTACT_IDを使用してContactを探し、ヒットしなければLOOKUP_KEYを使用する。


Uri lookupUri = getLookupUri(contactId, lookupKey);


Contactの集約により、CONTACT_IDは変化する可能性があるため、データの参照には常にURIを使用する必要がある。




0 件のコメント:

コメントを投稿