2012-04-20 4 views
1

Есть ли более быстрый способ считывания контактов в Android? Например, мой метод с курсором занимает 3-5 секунд для чтения 30-50 контактов. Это очень долго.Быстрые контакты для чтения android

 Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);  
      while (cursor.moveToNext()) 
      {   
       String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 

       String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 

       if (hasPhone.equalsIgnoreCase("1")) 
        hasPhone = "true"; 
       else 
        hasPhone = "false" ; 

       if (Boolean.parseBoolean(hasPhone)) 
       { 
       Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null); 
       while (phones.moveToNext()) 
       { 
        names.add(cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME))); 
        numbers.add(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 
       } 
       phones.close(); 
       } 
      }  

Любые идеи?

ответ

2

ваш вопрос интересен ....

читает быстрые контакты, потому что это время, чтобы прочитать данные из контактов ContactsContract ..

я не знаю о другом пути, чем тот, вы используете, но все же u может увеличить производительность, предоставив параметр проекции String [] в managedQuery ...

извлекает только те данные, которые требуются из контактов. Контракт, потому что, предоставляя нулевое значение, он извлекает все столбцы записи.

+0

Я согласен с этим ответом. Кроме того, вы должны использовать [CursorLoader] (http://developer.android.com/reference/android/content/CursorLoader.html), поскольку он будет выполнять работу с потоком пользовательского интерфейса (если вы этого еще не делаете). – hwrdprkns

+0

да, вы можете это сделать ... :) – Kri

2

Извините за мой плохой английский. Я создал подобный, но с другим стилем, используя HashMap. Я вставлю свой подход.

  //Create a hashMap, Key => Raw Contact ID and value => Object of customClass 

      HashMap<Long, ContactStructure> mFinalHashMap = new HashMap<Long, ContactStructure>(); 

      //Run IN query in data table. example 

      select mimetype_id, raw_contact_id, data1 to data14 from data where raw_contact_id IN (select _id from raw_contacts where deleted <> 1 and account_type = "phone" and account_name = "bla bla") and mimetype_id = (select _id from mimetypes where mimetype = "vnd.something.phone"); 

Теперь создайте класс, который будет иметь все данные контакта.

при доступе к курсору.

  while (cursor.moveToNext()) { 
       ContactStructure contactStructure = mFinalHashMap.get(rawContactID); 
     //It will return the previous instance of object, If we already put 
        if(rawContactStructure == null) { 
         contactStructure = ContactStructure.provideInstance(); 
        } 

    //Now check for your required mimeType 
          case MIMETYPE_PHONE: 
        contactStructure.hasPhoneNo = true; 
        contactStructure.phoneNumbers.add(addDetail); //add the data1 .. to data14 
       break; 

      } 

    /*Demo class for saving the details*/ 
    public class ContactMetaData { 
     static classContactStructure { 
        boolean   hasPhoneNo; 
      List<List<String>> phoneNumbers; 
    public static ContactStructure provideInstance() { 
contact.phoneNumbers = new ArrayList<List<String>>(); 
      ContactStructure contact = new RawContactStructure(); 
return contact 
    } 

    } 

использовать этот подход, я пробовал с 3000 контактов со всеми данными, это было быстро. нелегко получить все контакты и все их данные в секундах.

0

Для более быстрого чтения контактов вам необходимо использовать концепцию проекции , где указаны только столбцы, которые необходимо извлечь.

cursor.moveToFirst(); 
    while (cursor.isAfterLast() == false) { 

     String contactNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
     String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
     int phoneContactID = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)); 
     int contactID = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
     Log.d("con ", "name " + contactName + " " + " PhoeContactID " + phoneContactID + " ContactID " + contactID) 

     cursor.moveToNext(); 
    } 

Это поможет сократить сроки на 90% для полного урока я использовал этот сайт http://www.blazin.in/2016/02/loading-contacts-fast-from-android.html

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