15

私は連絡先を取得するために次のコードを持っていますcontent provider

String[] columns = new String[] {
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.PHOTO_ID };
        Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI,
                columns, null, null, null);

そして私はこれを使って特定の連絡先のメールをIDで取得します:

Cursor emails = getContentResolver().query(
                    ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                    null,
                    ContactsContract.CommonDataKinds.Email.CONTACT_ID
                            + " = " + contact.getContactId(), null, null);

私の現在の実装は、カーソル内のすべての行を渡し、その電子メールを取得して、JavaオブジェクトのarrayListに格納します。

私ができるかどうか疑問に思っていたのは、コンテンツプロバイダーにクエリを実行し、メールアドレスがリストされているID/名前などの連絡先だけのカーソルを返すことです。

この方法では、連絡先リストを取得するための待機期間が長くなります。このリストをリストアダプタに使用しています。電子メールのある連絡先のみを取得できる場合は、リスト内のカーソルアダプターを使用できます。

このようなことは可能ですか?どうすればプロセスをスピードアップできますか?

4

2 に答える 2

18

@CapDroid

DArkOの投稿からの動作コードを修正しました:

    ContentResolver cr = context.getContentResolver();
    String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, 
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.Contacts.PHOTO_ID,
            ContactsContract.CommonDataKinds.Email.DATA, 
            ContactsContract.CommonDataKinds.Photo.CONTACT_ID };
    String order = "CASE WHEN " 
            + ContactsContract.Contacts.DISPLAY_NAME 
            + " NOT LIKE '%@%' THEN 1 ELSE 2 END, " 
            + ContactsContract.Contacts.DISPLAY_NAME 
            + ", " 
            + ContactsContract.CommonDataKinds.Email.DATA
            + " COLLATE NOCASE";
    String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''";
    Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order);

カーソルには、名前と電子メールアドレスだけでなく、必須のIDも含まれます。このコードは少数の列のみを要求するため、このコードのパフォーマンスは優れています。

于 2013-04-04T20:00:16.473 に答える
10

私はこれを解決しました、これがその方法です:

アップデート

   String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID,
        ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID,
        Email.DATA, ContactsContract.CommonDataKinds.Photo.CONTACT_ID };

    String order = " CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME
        + " NOT LIKE '%@%' THEN 1" + " ELSE 2 END, "
        + ContactsContract.Contacts.DISPLAY_NAME + " COLLATE NOCASE";
    String filter = Email.DATA + " NOT LIKE '' ) GROUP BY ( " + Email.DATA;

    return mContent.query(Email.CONTENT_URI,
                      PROJECTION, filter, null, order);
于 2011-03-07T23:13:05.267 に答える