我正在寻找一种快速高效的方法来查询给定电子邮件地址的 Android 联系人(基本上,给定一个电子邮件地址,我想找到匹配的联系人(如果存在)。目前我有一个双 While 循环,它可能是完成此任务的最低效的方法。
我想我必须执行自定义 SQLite 连接查询,但我不熟悉如何执行此操作。来自其他用户的任何帮助或指点将不胜感激!
最佳答案
有一种方法可以在不查询第二个游标的情况下获取所需的详细信息。由于 ContentProvider 知道如何连接表,因此您也可以使用投影参数从连接表中请求列。
所以代码可能是这样的:
Cursor cursor = null;
try {
//Filter by email address first.
final String[] projection = new String[] {
ContactsContract.CommonDataKinds.Email.CONTACT_ID,
ContactsContract.CommonDataKinds.Email.DATA,
ContactsContract.CommonDataKinds.Email.DISPLAY_NAME_PRIMARY,
ContactsContract.CommonDataKinds.Email.IS_PRIMARY };
final String selection = ContactsContract.CommonDataKinds.Email.DATA + "=? and "
+ ContactsContract.CommonDataKinds.Email.IS_PRIMARY+"=1";
final String[] selectionArgs = new String[] { email };
cursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, projection, selection, selectionArgs, null);
if (cursor.moveToFirst()) {
long contactId = cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID));
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DISPLAY_NAME_PRIMARY));
// Do something with contactId and displayName
}
} finally {
if (cursor!=null) cursor.close();
}
所以 DISPLAY_NAME_PRIMARY 是一个由 ContentProvider 自动加入的列。不使用 IS_PRIMARY 来确保我们获得主要联系人原始数据而不是所有数据。
关于android - 给定电子邮件地址查询 Android 联系人的快速高效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11455608/