2011-02-03 75 views
0

我想从android.i中的设备获取所有手机联系人已使用以下code.but问题是需要更多时间来返回results.is有任何解决方案吗?android中的联系人

ContentResolver cr = getContentResolver(); 
     int index=0; 
     Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, 
       null, null, null, null); 

     if (cur.getCount() > 0) 
     { 
      phoneNames=new String[cur.getCount()]; 
      phoneNumbers=new String[cur.getCount()]; 
     while (cur.moveToNext()) 
     { 
      String id = cur.getString(
         cur.getColumnIndex(ContactsContract.Contacts._ID)); 
      name = cur.getString(
         cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 



     if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
     { 

      phoneNames[index]=name; 
      Cursor pCur = cr.query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
        null, 
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
        new String[]{id}, null); 


        while (pCur.moveToNext()) 
        { 
         phoneIndex++; 
         phoneNumbers[index] = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         index++; 
        } 
        pCur.close(); 

      }  
     } 
+0

你的意思是执行这段代码需要很长时间吗? – Dalmas 2011-02-03 18:01:50

回答

2

阅读代码后,我认为你想要的是一个列表显示名称和他们各自的电话号码的联系人。

如果你正在寻找与电话号码相关的数据,我建议你在 上查询android.provider.ContactsContract.PhoneLookup并使用单个游标获取结果。 以下是你会感兴趣的领域: DISPLAY_NAME HAS_PHONE_NUMBER NUMBER TYPE

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,... 

进一步详情,请参阅this

请发表您的要求,如果假设不对。

  • 一些快速检查:

    1. 仅选择所需的列,而不是所有在第一个查询。
    2. 而不是使用的Integer.parseInt(cur.getString)使用 cur.getInt()的
    3. 使用PhoneLookup每当有电话号码(数量 域给出的原始的电话号码,而不是 存储在 的值的处理数据库可以包含
      - ,),(附加它)
    4. 避免在游标中使用游标。使用包含 的API已经在其中实施,如 RawContactsEntity,PhoneLookup。

希望有帮助。

0

不要在UI线程上执行复杂的数据库查询。你想对结果做什么?如果您要在列表中显示内容,请使用CursorAdapter,这样您只需在需要时拔出所需内容即可。