Android检索手机通讯录查询需要很长时间

时间:2015-01-08 22:23:47

标签: java android sql

您好我正在使用下一个代码来检索手机通讯录的名称,号码及其被删除的时间。 在littel搜索之后我发现了cursor.moveToFirst()命令就是那个人。 但我可以找到任何解决方案):可能有人帮我吗? 谢谢!

public void loadPhoneMembers(){

    ContentResolver cr = this.getContentResolver(); 
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

    if(cursor.moveToFirst())
    {
        do
        {
            String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

            if(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
            {
                Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{ id }, null);
                while (pCur.moveToNext()) 
                {
                       String contactNumber=pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                       String contactName =    
pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

                       if(!phonesAdded.contains(contactNumber)){
                        members.add(contactName+","+contactNumber);  // members is arrayList
                        }

                    break;
                }
                pCur.close();
            }

        } while (cursor.moveToNext()) ;
    }

}

1 个答案:

答案 0 :(得分:4)

您正在为第一个查询中的每个联系人查询一个额外的Cursor。您可以在一个查询中查询姓名和电话号码,并忽略没有电话号码的联系人。

String[] projection = {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER ,ContactsContract.CommonDataKinds.Phone.PHOTO_URI};
Cursor cursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,projection, null, null, null);

此外,while (cursor.moveToNext()){ }

具有与以下相同的效果。

if(cursor.moveToFirst())
{
    do
    {

    } while (cursor.moveToNext()) ;