4

簡単な連絡先アプリケーションを開発し、名前を使用した検索も実装しました。しかし、今は名前と会社の両方を使用して検索したいと考えています (デフォルトの Android 連絡先アプリと同じように)。会社を使用して個別に検索することはできますが、返される連絡先 ID が異なるため、他の連絡先情報を取得できませんでした...下にコードを貼り付けました。

名前検索を使用して連絡先を取得するコード: (検索文字列は、textchangedlistener を使用して edittext から取得されます)

    private Cursor getContactsByName(String temp) {
        Uri uri = ContactsContract.Contacts.CONTENT_URI;
        String[] projection = new String[] { ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME, };
        String selection = ContactsContract.Contacts.DISPLAY_NAME + " like '"
            + temp + "%'";
        String[] selectionArgs = null;
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
            + " COLLATE LOCALIZED ASC";
        return managedQuery(uri, projection, selection, selectionArgs,
            sortOrder);
    }

企業検索を使用して連絡先を取得するコード: (検索文字列は、textchangedlistener を使用して edittext から取得されます)

    private Cursor getContactsByCompany(String temp) {      
        Uri uri = ContactsContract.Data.CONTENT_URI;
        String[] proj = new String[] { ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME, Organization.COMPANY};      

        String selection3 = Data.MIMETYPE + "='" + Organization.CONTENT_ITEM_TYPE +
            "' AND " + Organization.COMPANY + " like '" + temp + "%'";
        String[] selectionArgs = null;
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
            + " COLLATE LOCALIZED ASC";
        return managedQuery(uri, proj, 
            selection3, selectionArgs, sortOrder);      
    }

最初のケース (つまり、名前検索) では、連絡先 ID、名前などの情報を含むカーソルを取得しています。連絡先 ID を使用して、写真、メールなどの連絡先の情報をビューの連絡先ページに表示します。

2 番目のケース (会社検索) では、連絡先 ID、名前、および会社の情報を含むカーソルが表示されます。ただし、同じ連絡先に対して返される連絡先 ID は、最初のケースで返されるものとは異なります。そのため、この連絡先 ID を使用して写真、メールなどの連絡先の他の情報を取得することはできません。

連絡先の連絡先 ID がケース 1 とケース 2 の両方で同じ場合、重複を削除することで 2 つの検索を 1 つに統合できます。しかし、ここではそうではありません。

私の質問は、連絡先 ID が異なる場合に 2 番目のケースから連絡先情報を見つける方法と、2 つの検索を組み合わせる方法です。

4

3 に答える 3

2

ついに私は解決策を見つけました。

問題は、返される連絡先IDにありました。

したがって、最初のケース(つまり、名前で検索)では、ContactsContract.Contacts._IDを連絡先のIDとして使用する必要があります。

2番目のケース(つまり、会社による検索)では、URIが異なり(この場合はContactsContract.Data.CONTENT_URI)、選択基準Data.MIMETYPEがOrganization.CONTENT_ITEM_TYPEであるため、Organization.CONTACT_IDを使用する必要があります。

同様に、Eメールを使用して検索する場合は、ContactsContract.CommonDataKinds.Email.CONTACT_IDを連絡先IDとして使用する必要があります。他のフィールドについても同様です。

これらのContacidを使用して、名前と会社による検索を組み合わせることができます。Setコンセプトを使用して、連絡先IDの重複を削除できます。

于 2012-11-05T10:22:18.627 に答える
0

これには長い時間と多くのフラストレーションがかかりました。以下は、連絡先の名前、会社、役職で検索します。

/**
 * Creates the Loader used to load contact data filtered by the
 * given Query String.
 */
private Loader<Cursor> createLoaderFiltered(String theQueryString) 
{      
final String[] COLS = new String[] {"contact_id", ContactsContract.Contacts._ID, 
                                    ContactsContract.Contacts.DISPLAY_NAME};

final String LIKE = " LIKE '%" + theQueryString + "%'";
final Uri    URI = ContactsContract.Data.CONTENT_URI;
final String ORANIZATION_MIME = Organization.CONTENT_ITEM_TYPE;
final String NAME_MIME = StructuredName.CONTENT_ITEM_TYPE;
final String WHERE = 
    "(" + 
    Data.MIMETYPE + "='" + ORANIZATION_MIME + "'" +
    " AND (" + Organization.COMPANY + LIKE + " OR " + Organization.TITLE + LIKE + ")" +
    " AND " + ContactsContract.Contacts.DISPLAY_NAME + " NOT " + LIKE +
    ") OR (" +
    Data.MIMETYPE + "='" + NAME_MIME + "'" +
    " AND " + ContactsContract.Contacts.DISPLAY_NAME + LIKE + ")";

final String SORT = ContactsContract.Contacts.DISPLAY_NAME + 
                    " COLLATE LOCALIZED ASC";

return new CursorLoader(getActivity(), URI, COLS, WHERE, null, SORT);      
}

「ContactsContract.Contacts.DISPLAY_NAME NOT LIKE」句は、連絡先名と会社/役職の両方が一致する連絡先の重複行を排除するために必要です。

于 2014-10-20T16:49:19.613 に答える
0

この機能を組み合わせ検索に使用してください。

private Cursor getContactsByCompanyORname(String temp) {      
    Uri uri = ContactsContract.Data.CONTENT_URI;
    String[] proj = new String[] { ContactsContract.Contacts._ID,
        ContactsContract.Contacts.DISPLAY_NAME, Organization.COMPANY};      

    String selection3 = Data.MIMETYPE + "='" + Organization.CONTENT_ITEM_TYPE +
        "' AND " + Organization.COMPANY + " like '" + temp + "%'" + "' OR '" ContactsContract.Contacts.DISPLAY_NAME + " like '" + temp + "%'";
    String[] selectionArgs = null;
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
        + " COLLATE LOCALIZED ASC";
    return managedQuery(uri, proj, 
        selection3, selectionArgs, sortOrder);      
}

そのため、文字列の選択を変更します3

于 2012-10-30T13:19:38.467 に答える