1

メールアドレスを指定してAndroidの連絡先をクエリするための高速で効率的な方法を探しています(基本的に、メールアドレスがあれば、一致する連絡先を見つけたいと思います)。現在、私は 2 つの While ループを使用していますが、これはおそらく最も効率の悪い方法です。

カスタム SQLite 結合クエリを実行する必要があると思いますが、これを行う方法に慣れていません。他のユーザーからのヘルプやアドバイスをいただければ幸いです。

4

2 に答える 2

2

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 を使用して、すべてのデータではなく、主要な連絡先の生データを取得することを確認するためではありません。

于 2014-10-19T06:34:08.763 に答える
1

もう少し調査した結果、このタイプの要求を処理するコントラクトはなく、所有していない 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.

ありがとう!

于 2012-07-12T18:30:44.077 に答える