使用姓名和公司搜索联系人(如默认的android 2.3.3联系人应用程序)
我开发了一个简单的联系人应用程序,还使用name实现了搜索。但现在我想同时使用姓名和公司进行搜索(就像默认的android联系人应用程序一样)。我可以使用公司单独搜索,但无法获取其他联系信息,因为返回的联系人id不同…我已将代码粘贴在下面 使用姓名搜索获取联系人的代码: (使用textchangedlistener从edittext获取搜索字符串) 使用公司搜索获取联系人的代码: (使用textchangedlistener从edittext获取搜索字符串) 在第一种情况下(即姓名搜索),我得到一个带有联系人id、姓名等信息的光标。使用联系人id,我在查看联系人页面中显示联系人的信息,如照片、电子邮件 在第二种情况下(即公司搜索),我得到一个带有联系人id、姓名和公司信息的光标。但在这里,为相同联系人返回的联系人id与第一种情况下返回的不同。所以我无法使用此联系人id获取联系人的其他信息,如照片、电子邮件等 如果联系人的联系人id在案例1和案例2中都相同,我可以通过删除重复项将这两个搜索集成为一个。但事实并非如此使用姓名和公司搜索联系人(如默认的android 2.3.3联系人应用程序),android,android-contacts,contactscontract,Android,Android Contacts,Contactscontract,我开发了一个简单的联系人应用程序,还使用name实现了搜索。但现在我想同时使用姓名和公司进行搜索(就像默认的android联系人应用程序一样)。我可以使用公司单独搜索,但无法获取其他联系信息,因为返回的联系人id不同…我已将代码粘贴在下面 使用姓名搜索获取联系人的代码: (使用textchangedlistener从edittext获取搜索字符串) 使用公司搜索获取联系人的代码: (使用textchangedlistener从edittext获取搜索字符串) 在第一种情况下(即姓名搜索),我得到
因此,我的问题是,如果联系人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);
}