メールアドレスを指定してAndroidの連絡先をクエリするための高速で効率的な方法を探しています(基本的に、メールアドレスがあれば、一致する連絡先を見つけたいと思います)。現在、私は 2 つの While ループを使用していますが、これはおそらく最も効率の悪い方法です。
カスタム SQLite 結合クエリを実行する必要があると思いますが、これを行う方法に慣れていません。他のユーザーからのヘルプやアドバイスをいただければ幸いです。
2 番目のカーソルを照会せずに、必要な詳細を取得する方法があります。ContentProvider はテーブルを結合する方法を認識しているため、射影パラメーターを使用して結合テーブルから列をリクエストすることもできます。
したがって、コードは次のようになります。
Cursor cursor = null;
try {
//Filter by email address first.
final String[] projection = new String[] {
ContactsContract.CommonDataKinds.Email.CONTACT_ID,
ContactsContract.CommonDataKinds.Email.DATA,
ContactsContract.CommonDataKinds.Email.DISPLAY_NAME_PRIMARY,
ContactsContract.CommonDataKinds.Email.IS_PRIMARY };
final String selection = ContactsContract.CommonDataKinds.Email.DATA + "=? and "
+ ContactsContract.CommonDataKinds.Email.IS_PRIMARY+"=1";
final String[] selectionArgs = new String[] { email };
cursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, projection, selection, selectionArgs, null);
if (cursor.moveToFirst()) {
long contactId = cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID));
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DISPLAY_NAME_PRIMARY));
// Do something with contactId and displayName
}
} finally {
if (cursor!=null) cursor.close();
}
したがって、DISPLAY_NAME_PRIMARY は、ContentProvider によって自動的に結合される列です。IS_PRIMARY を使用して、すべてのデータではなく、主要な連絡先の生データを取得することを確認するためではありません。
もう少し調査した結果、このタイプの要求を処理するコントラクトはなく、所有していない DB に対してカスタム SQL クエリを実行することはできません。私ができる最善の解決策を考え出しました。これについてコメントして、これをより良く/より速く/効率的に実行する方法があるかどうか教えてください。
String incomingEmail = [EMAIL_WE_ARE_SEARCHING_FOR]...
long contactID = -1;
//Filter by email address first.
final String[] emailProjection = new String[]{ContactsContract.CommonDataKinds.Email.CONTACT_ID,
ContactsContract.CommonDataKinds.Email.DATA};
final String emailSelection = ContactsContract.CommonDataKinds.Email.DATA + "=?";
final String[] emailSelectionArgs = new String[]{incomingEmail};
final String emailSortOrder = null;
Cursor emailCursor = context.getContentResolver().query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
emailProjection,
emailSelection,
emailSelectionArgs,
emailSortOrder);
if(emailCursor.moveToFirst()){
contactID = emailCursor.getLong(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID));
//Query the specific contact if found.
final String[] projection = new String[]{ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.PHOTO_ID,
ContactsContract.Contacts.LOOKUP_KEY};
final String selection = ContactsContract.Contacts._ID + "=?";
final String[] selectionArgs = new String[]{String.valueOf(contactID)};
final String sortOrder = null;
Cursor contactCursor = context.getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI,
projection,
selection,
selectionArgs,
sortOrder);
if(contactCursor.moveToFirst()){
contactName = contactCursor.getString(contactCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
String photoIDTmp = contactCursor.getString(contactCursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
if(photoIDTmp != null){
photoID = Long.parseLong(photoIDTmp);
}
lookupKey = contactCursor.getString(contactCursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
}
contactCursor.close();
}else{
emailCursor.close();
return null;
}
emailCursor.close();
//Return Contact ID, Contact Name, Contact Photo, Etc.
ありがとう!