我开发了一个简单的联系人应用程序,并使用名称实现了搜索。但现在我想使用名称和公司进行搜索(就像默认的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不同,如何从第二个案例中找到联系信息,我该如何结合这两个搜索?
答案 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”子句来消除与联系人姓名和公司/标题相匹配的联系人的重复行。