Android - Как получить имя и номер контакта без использования курсоров? - PullRequest
0 голосов
/ 28 мая 2011

У меня большая проблема с производительностью в моем приложении.Пройдя трассировку, я обнаружил, что большая часть производительности моего приложения потребляется курсорами.Поэтому мне было интересно, есть ли альтернатива курсорам для работы со списком контактов устройства.А если альтернативы нет, то, пожалуйста, посоветуйте мне, как работать с курсорами, чтобы это не замедляло ваше приложение.

Пожалуйста, ПОМОГИТЕ !!

Спасибо.

Эточасть моего кода имеет проблемы с производительностью: -

public void getDisplayName()
{       
    Cursor c1 = this.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

    String personName = null, number = null;
    try 
    {
        Log.e(TAG, "I am here!!");
        if(c1.getCount() > 0)
        {
            Log.e(TAG, "I am here2!!");
            while(c1.moveToNext())
            {
                HashMap<String,String> item = new HashMap<String,String>();
                String id = c1.getString(c1.getColumnIndex(Contacts._ID));
                personName = c1.getString(c1.getColumnIndex(Contacts.DISPLAY_NAME));
                item.put("Name", personName);
                Cursor cur = this.getContentResolver().query(CommonDataKinds.Phone.CONTENT_URI, null, CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);
                while(cur.moveToNext())
                {
                    Log.e(TAG, "I am here!!3");
                    number = cur.getString(cur.getColumnIndex(CommonDataKinds.Phone.NUMBER));
                    item.put("Number", number);
                }
                displayName.add(item);          
            }
        }
    }
    finally
    {
        c1.close();
    }
}

Ответы [ 2 ]

1 голос
/ 28 мая 2011

Как получить имя и номер контакта без использования курсоров?

Это невозможно.

У меня большая проблема с производительностью в моем приложении,

Вместо того, чтобы использовать один запрос, вы используете N + 1 запросов, где N - количество строк, возвращаемых другим запросом.Это гарантированно даст вам низкую производительность по сравнению с простым выполнением одного запроса.

Вы можете получить имя пользователя и _ID вместе с номерами телефонов:

    String[] PROJECTION=new String[] { Contacts._ID,
                                        Contacts.DISPLAY_NAME,
                                        Phone.NUMBER
                                        };
    Cursor c=a.managedQuery(Phone.CONTENT_URI, PROJECTION, null, null, null);

Кроме того, никогда не звоните getColumnIndex() в цикле, так как значение никогда не меняется.

0 голосов
/ 25 июля 2013

Я работал над одним и тем же кодом, и мне нужны адреса электронной почты и номера телефонов для первого подхода. Для получения 612 контактов потребовалось около 35 секунд, для оптимизации 6 секунд потребовалось 612 контактов

мойкод.

ContentResolver cr = context.getContentResolver ();

    String[] projection = new String[] { Contacts.DISPLAY_NAME, Phone.NUMBER };

    String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ?";
    String[] selectionArgs = { String.valueOf(1) };

    Cursor cur = cr.query(Phone.CONTENT_URI, projection, selection, selectionArgs, null);

    if (cur.getCount() > 0) {
        while (cur.moveToNext()) {
            String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            String phNo = cur.getString(cur.getColumnIndex(Phone.NUMBER));
            ContactModel contactModel = new ContactModel();
            contactModel.setName(name);
            contactModel.setPhoneNumber(phNo);
            contactList.add(contactModel);
        }
    }

    String[] projectionEmail = new String[] { Contacts.DISPLAY_NAME, Email.ADDRESS };

    String selectionEmail = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ?";
    String[] selectionArgsEmail = { String.valueOf(1) };

    Cursor curEmail = cr.query(Email.CONTENT_URI, projectionEmail, selectionEmail, selectionArgsEmail, null);

    if (curEmail.getCount() > 0) {
        while (curEmail.moveToNext()) {
            String Emailname = curEmail.getString(curEmail.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            String email = curEmail.getString(curEmail.getColumnIndex(Email.ADDRESS));
            ContactModel contactModel = new ContactModel();
            contactModel.setName(Emailname);
            contactModel.setEmailId(email);
            contactList.add(contactModel);
        }
    }

`

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...