2011-02-03 2 views
0

Я хочу, чтобы все телефонные контакты с устройства в android.i использовали следующий код. Но проблема в том, что для возврата результатов требуется больше времени. Есть ли какое-либо решение?контакты в 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

+0

yes.some 6 секунд .. – Kakey

+0

У вас есть n^3 сложности здесь с n^2 различными транзакциями базы данных. Вы почти наверняка можете сделать все это в одном запросе базы данных. – Falmarri

ответ

2

После прочтения кода я предполагаю, что вам нужен список контактов с DISPLAY NAMES и их номера телефонов.

Если вы специально ищете данные, относящиеся к номерам телефонов, я предлагаю вам запрос на android.provider.ContactsContract.PhoneLookup и получить результаты с помощью одного курсора. Ниже перечислены поля, которые были бы заинтересованы в: DISPLAY_NAME HAS_PHONE_NUMBER НОМЕР ТИП

например

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

Не выполняйте сложные запросы к базе данных в потоке пользовательского интерфейса. Что вы пытаетесь сделать с результатами? Если вы показываете вещи в списке, используйте CursorAdapter, чтобы вы только вытаскивали то, что вам нужно, когда вам это нужно.

Смежные вопросы