使用名称和公司搜索联系人(如默认的android 2.3.3联系人应用程序)

时间:2012-10-25 09:52:38

标签: android android-contacts contactscontract

我开发了一个简单的联系人应用程序,并使用名称实现了搜索。但现在我想使用名称和公司进行搜索(就像默认的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不同。所以我无法使用此联系人ID获取联系人的其他信息,如照片,电子邮件等。

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

所以我的问题是,如果联系人ID不同,如何从第二个案例中找到联系信息,我该如何结合这两个搜索?

3 个答案:

答案 0 :(得分: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。 其他领域也是如此。

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

答案 1 :(得分: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

答案 2 :(得分: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”子句来消除与联系人姓名和公司/标题相匹配的联系人的重复行。