我有以下代码可以从 content provider
获取联系人
String[] columns = new String[] {
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts._ID,
ContactsContract.Contacts.PHOTO_ID };
Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI,
columns, null, null, null);
我用这个通过他们的 id 获取特定联系人的电子邮件:
Cursor emails = getContentResolver().query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID
+ " = " + contact.getContactId(), null, null);
我当前的实现传递游标中的每一行并获取其电子邮件并将它们存储在 java 对象的数组列表中。
我想知道是否可以只查询内容提供者并返回一个游标,其中包含列出了电子邮件地址的 ids/name 等联系人。
这种方式获取联系人列表的等待时间较长。我将此列表用于列表适配器。如果我只能获得有电子邮件的联系人,我可以在我的列表中使用游标适配器。
这样的事情可能吗?我怎样才能加快这个过程?
最佳答案
@CapDroid
修复了 DArkO 帖子中的工作代码:
ContentResolver cr = context.getContentResolver();
String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.PHOTO_ID,
ContactsContract.CommonDataKinds.Email.DATA,
ContactsContract.CommonDataKinds.Photo.CONTACT_ID };
String order = "CASE WHEN "
+ ContactsContract.Contacts.DISPLAY_NAME
+ " NOT LIKE '%@%' THEN 1 ELSE 2 END, "
+ ContactsContract.Contacts.DISPLAY_NAME
+ ", "
+ ContactsContract.CommonDataKinds.Email.DATA
+ " COLLATE NOCASE";
String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''";
Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order);
您的光标将具有基本 ID 以及姓名和电子邮件地址。此代码的性能非常好,因为它只请求很少的列。
关于Android 仅对列出了电子邮件的联系人获取光标 >android 2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5205999/