Android获取联系人姓名和号码查询

问题描述:

我试图检索显示名称和所有我的联系人的电话号码,但我希望它只返回有数字的行。Android获取联系人姓名和号码查询

目前我有像这样和它的作品:

ContentResolver cr = getContentResolver(); 
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,null, null, ContactsContract.Contacts.DISPLAY_NAME+ " COLLATE NOCASE"); 
while (cur.moveToNext()) 
{   
    if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
    { 
         String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
         String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));      
         contacts[index] = name;         

         Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); 
         pCur.moveToFirst();         
         numbers[index] = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         index++; 
         pCur.close(); 
     } 

的事情是,它需要像4-5秒,因为它是运行cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);像400次加载。


现在我的理解是,联系人的姓名和号码保存在不同的表格中,并且您需要姓名的编号以获取号码。

这可以以任何其他方式更快地完成吗?

在此先感谢

@mixkat 我已经想出了一个更多的解决方案。

仅使用一个查询就可以获取姓名和电话号码。

下面是代码:

String WHERE_CONDITION = ContactsContract.Data.MIMETYPE + " = '" + ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'"; 
    String[] PROJECTION = {ContactsContract.Data.DISPLAY_NAME, ContactsContract.Data.DATA1}; 
    String SORT_ORDER = ContactsContract.Data.DISPLAY_NAME; 

    Cursor cur = context.getContentResolver().query(
      ContactsContract.Data.CONTENT_URI, 
      PROJECTION, 
      WHERE_CONDITION, 
      null, 
      SORT_ORDER); 

在这种情况下,您查询没有直接联系供应商,而是数据提供商。

+0

@Maxim谢谢你回答一个老话题!你确定吗? – mixkat 2011-04-28 14:42:14

+0

@mixkat我这么认为。游标有两列。 [0] - 显示名称[1] - 电话号码。我检查了它适用于我。 – Maxim 2011-04-28 14:54:18

+0

@Maxim对我来说,它会为所有联系人返回相同的号码! – mixkat 2011-04-28 15:11:04

我有同样的问题。我通过在db第一次用户打开的应用程序中保存联系人来解决它。并且比我更新数据(当应用程序更新联系人时由您决定)。

因此,应用程序使用我的数据库表中的姓名和号码在一行中的联系人。这需要更少的时间。

+0

是的,我也这么想!但是没有其他方法吗?我可能需要每次需要更新数字列表时(即每次调用特定方法时),因为自上次更新以来联系人可能已发生变化,所以对我来说这不是真正的解决方案! – mixkat 2011-03-30 12:36:41

+0

@mixkat此链接可能是有用的[链接] http://*.com/questions/1401280/how-to-listen-for-changes-in-contact-database – Maxim 2011-03-30 12:46:03

+0

是啊看起来不错...我会尝试谢谢! – mixkat 2011-03-31 19:46:53