我想获取所有的联系人至少有一个电话号码,我也希望所有的电话号码和每个联系人的所有电子邮件。
当前代码:
// To get All Contacts having atleast one phone number.
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " > ?";
String[] selectionArgs = new String[] {"0"};
Cursor cu = applicationContext.getContentResolver().query(uri,
null, selection, selectionArgs, null);
// For getting All Phone Numbers and Emails further queries :
while(cu.moveToNext()){
String id = cu.getString(cu.getColumnIndex(ContactsContract.Contacts._ID));
// To get Phone Numbers of Contact
Cursor pCur = context.getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?",
new String[]{id}, null);
// To get Email ids of Contact
Cursor emailCur = context.getContentResolver().query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
new String[]{id}, null);
// Iterate through these cursors to get Phone numbers and Emails
}
字符串
如果我的设备中有超过1000个联系人,则需要花费太多时间。如何在单个查询中获取所有数据,而不是为每个联系人执行两个额外查询?
有没有其他方法可以优化?
提前谢谢你。
2条答案
按热度按时间zfciruhq1#
ICS:当您从
Data.CONTENT_URI
查询时,您已经连接了相关Contact
的所有数据列-也就是说,这会有效:Java语言:
字符串
Kotlin:
型
如果您的目标是2.3,则需要考虑这样一个事实,即在查询
Data
时,HAS_PHONE_NUMBER
无法通过所使用的连接获得。Fun
的值。“例如,这可以通过跳过联系人“必须”有电话号码的要求,而满足于“任何至少有电话号码或电子邮件地址的联系人”来解决:
型
如果这不是一个选项,您可以随时选择一个可怕的黑客子选择:
型
或者通过使用两个
Cursor
s来求解它:型
zed5wv102#
我经历了完全相同的问题。从那时起,我建立了自己的解决方案,灵感来自这篇文章,但有点不同。现在我想分享它作为我的第一个StackOverFlow答案:-)
它与Jens建议的双光标方法非常相似。
1-从“联系人”表中获取相关联系人
2-获取相关联系人信息(邮件、电话等)
3-将这些结果合并
“相关”当然是由你决定的,但重要的一点是性能!此外,我相信其他解决方案使用非常适合的SQL查询也可以完成这项工作,但在这里我只想使用Android ContentProvider这里是代码:
部分常量
字符串
1联系方式
这里我要求Contacts必须有不带“@”的name_NAME,并且它们的信息匹配给定的字符串(这些要求当然可以修改)。下面的方法的结果是第一个光标:
型
正如您将看到的,这个查询的性能非常好!
2联系方式
现在让我们获取联系人信息。在这一点上,我不做任何链接之间已经取得的联系人和检索到的信息:我只是从数据表中获取所有信息...然而,为了避免无用的信息,我仍然需要没有“@”的名称,因为我对电子邮件和电话感兴趣,我需要数据MIMETYPE是MAIL_TYPE或PHONE_TYPE下面是代码:
型
你会再次看到这个查询非常快.
3合并
现在让我们将联系人和他们各自的信息合并。我们的想法是使用HashMap(Key,String),其中Key是联系人id,String是任何你喜欢的(姓名,电子邮件,.)。
首先,我遍历Contact光标(按顺序排列),并将姓名和图片uri存储在两个不同的HashMap中。
我对联系人信息(邮件和电子邮件)做了同样的操作。但现在我注意到两个光标之间的相关性:如果电子邮件或电话的CONTACT_ID没有出现在contactListId中,它将被放在一边。我还检查电子邮件是否已经被遇到。注意,这种进一步的选择可能会在Name/Picture内容和Email/Phone HashMap内容之间引入不对称,但不用担心。
最后,我运行了contactListId列表,并构建了一个Contact对象列表,其中考虑了以下事实:联系人必须有信息(keySet条件),并且联系人必须至少有一封邮件或一封电子邮件(例如,如果联系人是Skype联系人,则可能会出现mail == null && phone == null的情况)。下面是代码:
型
Contact对象的定义由您决定。
希望这对你有帮助,并感谢前一篇文章。
纠正/改进
我忘了检查手机按键设置:它应该看起来像
型
改为
型
使用电话键集
型
我为什么不添加一个空的联系人光标检查如下:
型
就在getContactCursor调用之后