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

使用姓名和公司搜索联系人(如默认的android 2.3.3联系人应用程序),android,android-contacts,contactscontract,Android,Android Contacts,Contactscontract,我开发了一个简单的联系人应用程序,还使用name实现了搜索。但现在我想同时使用姓名和公司进行搜索(就像默认的android联系人应用程序一样)。我可以使用公司单独搜索,但无法获取其他联系信息,因为返回的联系人id不同…我已将代码粘贴在下面 使用姓名搜索获取联系人的代码: (使用textchangedlistener从edittext获取搜索字符串) 使用公司搜索获取联系人的代码: (使用textchangedlistener从edittext获取搜索字符串) 在第一种情况下(即姓名搜索),我得到

我开发了一个简单的联系人应用程序,还使用name实现了搜索。但现在我想同时使用姓名和公司进行搜索(就像默认的android联系人应用程序一样)。我可以使用公司单独搜索,但无法获取其他联系信息,因为返回的联系人id不同…我已将代码粘贴在下面

使用姓名搜索获取联系人的代码: (使用textchangedlistener从edittext获取搜索字符串)

使用公司搜索获取联系人的代码: (使用textchangedlistener从edittext获取搜索字符串)

在第一种情况下(即姓名搜索),我得到一个带有联系人id、姓名等信息的光标。使用联系人id,我在查看联系人页面中显示联系人的信息,如照片、电子邮件

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

如果联系人的联系人id在案例1和案例2中都相同,我可以通过删除重复项将这两个搜索集成为一个。但事实并非如此


因此,我的问题是,如果联系人id不同,如何从第二种情况中查找联系人信息,以及如何组合这两种搜索?

使用此功能进行组合搜索。。愿它对你有帮助

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

我终于找到了解决方案

返回的联系人id存在问题

因此,在第一种情况下(即按姓名搜索),我们必须将联系人contract.Contacts.\u ID作为联系人的ID

在第二种情况下(,即按公司搜索),由于Uri不同(在本例中为contacts contract.Data.CONTENT\u Uri),而且选择条件Data.MIMETYPE为Organization.CONTENT\u ITEM\u TYPE,因此我们必须使用Organization.CONTACT\u ID

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


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

这花费了很长时间,也带来了很多挫折!以下按联系人姓名、公司和职务进行搜索:

/**
 * 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);      
}
/**
*创建用于加载由筛选的联系人数据的加载程序
*给定的查询字符串。
*/
私有加载器createLoaderFiltered(字符串查询字符串)
{      
最终字符串[]COLS=新字符串[]{“联系人id”,ContactsContract.Contacts.\u id,
Contacts contract.Contacts.DISPLAY\u NAME};
最后一个字符串LIKE=“LIKE“%”+theQueryString+“%”;
最终Uri=contacts contract.Data.CONTENT\u Uri;
最终字符串ORANIZATION\u MIME=Organization.CONTENT\u ITEM\u TYPE;
最终字符串名称\u MIME=StructuredName.CONTENT\u ITEM\u TYPE;
最后一个字符串,其中=
"(" + 
Data.MIMETYPE+“=”+ORANIZATION_MIME+“”+
和(“+Organization.COMPANY+LIKE+”或“+Organization.TITLE+LIKE+”)+
“和”+联系人contract.Contacts.DISPLAY_NAME+“NOT”+类似+
)或+
Data.MIMETYPE+“=”+NAME_MIME+“”+
“和“+Contacts.Contacts.DISPLAY_NAME+LIKE+””;
最终字符串排序=Contacts contract.Contacts.DISPLAY_NAME+
“整理本地化ASC”;
返回新的游标装入器(getActivity(),URI,COLS,WHERE,null,SORT);
}

需要使用“Contacts contract.Contacts.DISPLAY_NAME NOT LIKE”子句来消除联系人姓名和公司/职务匹配的重复行。

我在选择3中使用了您的代码,但语法有细微的更改,但它不起作用。。。
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);      
}
/**
 * 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);      
}