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,我在查看联系人页面中显示联系人的信息,例如照片、电子邮件。

在第二种情况下(即公司搜索),我得到一个带有信息联系人 ID、姓名和公司的光标。但是这里为相同联系人返回的联系人 id 与第一种情况下返回的不同。因此,我无法使用此联系人 ID 获取联系人的其他信息,例如照片、电子邮件等。

如果在案例 1 和案例 2 中联系人的联系人 ID 相同,我可以通过删除重复项将这两个搜索整合为一个。但这里不是这种情况。

所以我的问题是,如果联系人 ID 不同,我如何从第二种情况中找到联系信息,以及如何将这两种搜索结合起来?

4

3 回答 3

2

最后我找到了解决方案。

问题在于返回的联系人 ID。

所以在第一种情况下(即按姓名搜索),我们必须将ContactsContract.Contacts._ID作为联系人的 id。

在第二种情况下(即按公司搜索),由于 Uri 不同(在这种情况下是 ContactsContract.Data.CONTENT_URI),而且选择标准 Data.MIMETYPE 是 Organization.CONTENT_ITEM_TYPE,我们必须使用 Organization.CONTACT_ID

同样,当您使用电子邮件进行搜索时,您必须使用 ContactsContract.CommonDataKinds.Email.CONTACT_ID 作为联系人 ID。其他领域也是如此。

使用这些联系人 ID,我们可以按名称和公司组合搜索。我们可以使用Set概念删除联系人 ID 中的重复项。

于 2012-11-05T10:22:18.627 回答
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 回答
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 回答