如何在一个SQLite查询中获取联系人ID,电子邮件,电话号码?联系人Android Optimization

前端之家收集整理的这篇文章主要介绍了如何在一个SQLite查询中获取联系人ID,电子邮件,电话号码?联系人Android Optimization前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想通过一个电话号码获取所有联系人,我也想要每个联系人的所有电话号码和所有电子邮件

当前代码

  1. // To get All Contacts having atleast one phone number.
  2.  
  3. Uri uri = ContactsContract.Contacts.CONTENT_URI;
  4. String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " > ?";
  5. String[] selectionArgs = new String[] {"0"};
  6. Cursor cu = applicationContext.getContentResolver().query(uri,null,selection,selectionArgs,null);
  7.  
  8. // For getting All Phone Numbers and Emails further queries :
  9. while(cu.moveToNext()){
  10. String id = cu.getString(cu.getColumnIndex(ContactsContract.Contacts._ID));
  11.  
  12.  
  13. // To get Phone Numbers of Contact
  14. Cursor pCur = context.getContentResolver().query(
  15. ContactsContract.CommonDataKinds.Phone.CONTENT_URI,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?",new String[]{id},null);
  16.  
  17. // To get Email ids of Contact
  18. Cursor emailCur = context.getContentResolver().query(
  19. ContactsContract.CommonDataKinds.Email.CONTENT_URI,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",null);
  20.  
  21. // Iterate through these cursors to get Phone numbers and Emails
  22. }

如果我的设备中有超过1000个联系人,则需要花费太多时间。如何在单个查询获取所有数据,而不是为每个联系人增加两个查询

还是有其他的优化方法

先谢谢你。

ICS:当您从Data.CONTENT_URI查询时,您已将所有相关联的联系人的行已加入 – 即这将工作:
  1. ContentResolver resolver = getContentResolver();
  2. Cursor c = resolver.query(
  3. Data.CONTENT_URI,Data.HAS_PHONE_NUMBER + "!=0 AND (" + Data.MIMETYPE + "=? OR " + Data.MIMETYPE + "=?)",new String[]{Email.CONTENT_ITEM_TYPE,Phone.CONTENT_ITEM_TYPE},Data.CONTACT_ID);
  4.  
  5. while (c.moveToNext()) {
  6. long id = c.getLong(c.getColumnIndex(Data.CONTACT_ID));
  7. String name = c.getString(c.getColumnIndex(Data.DISPLAY_NAME));
  8. String data1 = c.getString(c.getColumnIndex(Data.DATA1));
  9.  
  10. System.out.println(id + ",name=" + name + ",data1=" + data1);
  11. }

如果您要定位2.3,则需要考虑到在查询数据时使用的连接不能使用HAS_PHONE_NUMBER。

乐趣。

例如,这可以通过跳过您的联系人必须具有电话号码的要求来解决,而不是解决“至少有一个电话号码或电子邮件地址的任何联系人”:

  1. Cursor c = resolver.query(
  2. Data.CONTENT_URI,Data.MIMETYPE + "=? OR " + Data.MIMETYPE + "=?",Data.CONTACT_ID);

如果这不是一个选项,你总是可以去一个可怕的黑客子选择:

  1. Cursor c = resolver.query(
  2. Data.CONTENT_URI,"(" + Data.MIMETYPE + "=? OR " + Data.MIMETYPE + "=?) AND " +
  3. Data.CONTACT_ID + " IN (SELECT " + Contacts._ID + " FROM contacts WHERE " + Contacts.HAS_PHONE_NUMBER + "!=0)",Data.CONTACT_ID);

或使用两个游标来解决它:

  1. Cursor contacts = resolver.query(Contacts.CONTENT_URI,Contacts.HAS_PHONE_NUMBER + " != 0",Contacts._ID + " ASC");
  2. Cursor data = resolver.query(Data.CONTENT_URI,Data.CONTACT_ID + " ASC");
  3.  
  4. int idIndex = contacts.getColumnIndexOrThrow(Contacts._ID);
  5. int nameIndex = contacts.getColumnIndexOrThrow(Contacts.DISPLAY_NAME);
  6. int cidIndex = data.getColumnIndexOrThrow(Data.CONTACT_ID);
  7. int data1Index = data.getColumnIndexOrThrow(Data.DATA1);
  8. boolean hasData = data.moveToNext();
  9.  
  10. while (contacts.moveToNext()) {
  11. long id = contacts.getLong(idIndex);
  12. System.out.println("Contact(" + id + "): " + contacts.getString(nameIndex));
  13. if (hasData) {
  14. long cid = data.getLong(cidIndex);
  15. while (cid <= id && hasData) {
  16. if (cid == id) {
  17. System.out.println("\t(" + cid + "/" + id + ").data1:" +
  18. data.getString(data1Index));
  19. }
  20. hasData = data.moveToNext();
  21. if (hasData) {
  22. cid = data.getLong(cidIndex);
  23. }
  24. }
  25. }
  26. }

猜你在找的Sqlite相关文章