2012-08-24 18 views
13

OtomatikCompleteTextView uygulamıyorum ve tüm kişilerimin Ad ve E-Postalarına ihtiyacım var. Senkronize olmayan bir şekilde çalıştığımı bu snippet'i buldum ancak çok yavaş.Kişi listesinden ad ve e-posta alma çok yavaş

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

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

     Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null); 

      while (emailCur.moveToNext()) { 

       String email = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
        autoCompleteAdapter.add(name + " - " + email); 
      } 

      emailCur.close(); 
     } 
    } 
} 

Bir tür iç sorgu gerçekleştiriyorum ve bence sorun bu. Onu ayarlamak ve daha hızlı yapmak için bir yolu var mı?

+0

Çalışmayı başarabildiniz mi? –

+0

Dış 'if (cur.getCount()> 0)' gereksizdir ve kaldırılabilir. – mdup

cevap

46
private static final String[] PROJECTION = new String[] { 
    ContactsContract.CommonDataKinds.Email.CONTACT_ID, 
    ContactsContract.Contacts.DISPLAY_NAME, 
    ContactsContract.CommonDataKinds.Email.DATA 
}; 

... 

ContentResolver cr = getContentResolver(); 
Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, null, null, null); 
if (cursor != null) { 
    try { 
     final int contactIdIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID); 
     final int displayNameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 
     final int emailIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA); 
     long contactId; 
     String displayName, address; 
     while (cursor.moveToNext()) { 
      contactId = cursor.getLong(contactIdIndex); 
      displayName = cursor.getString(displayNameIndex); 
      address = cursor.getString(emailIndex); 
      ... 
     } 
    } finally { 
     cursor.close(); 
    } 
} 

birkaç not:

  • kullanımı sadece ContactsContract.CommonDataKinds.Email.CONTENT_URI, aradığınız bilgilere ulaşmak Eğer gerçekten gereken sadece bu sütunları almak için
  • kullanım projeksiyonu sorgulayabilir sütunları bilgisi için ContactsContract.CommonDataKinds.Email görmek, kaydetmek bazı bellek ve sorgu performansını artırın
  • Sütun dizinlerini yalnızca bir kez olsun, zaman döngüsünden hemen önce
+0

Mükemmel çalışıyor. Teşekkür –

+0

Bir çekicilik gibi çalışın ..:) – ADT

+0

thanx alot, inanılmaz iyileştirme –

5

doğrudan ContactsContract.Contacts

yapmak eposta veri tür ContactsContract.CommonDataKinds sadece bir sorgusu sorgulamak gerekir.

ContactsContract.CommonDataKinds.Email, projeksiyonunuzu oluşturmak için kullanabileceğiniz birçok diğer arabirimi devralır. Sen (örneğin kullanıcı kimliği gibi kullanıcı görünen adı birçok bilgi alabilirsiniz

import android.provider.ContactsContract.CommonDataKinds.Email; 

[...] 

public static final String[] EMAILS_PROJECTION = new String[] { 
    Email._ID, 
    Email.DISPLAY_NAME_PRIMARY, 
    Email.ADDRESS 
}; 

Email.CONTENT_URI 

ile kullanılacak Örneğin:

(belgelerine miras sabitleri bakınız) ...) doğrudan e-posta veri türünden.

DÜZENLEME: Sadece bir AutoCompleteTextView inşa etmeye çalışıyoruz gerçekleştirilen

.

Sen runQueryOnBackgroundThread yönteminizi ve CursorAdapter ait convertToString geçersiz kılmak ve ApiDemo örneklerinin bakmak için sana önermek gerçekten şiddetleEmail.CONTENT_FILTER_URI

kullanmalıdır. Eğer HERE bulabilirsiniz

Özellikle AutoComplete4.java örnek.

+1

Teşekkürler Timothée, açıklamanız çok iyi yapılmış. Çok kötü Her iki cevabı da doğru olarak işaretleyemem. Bence biegleux'un cevabı, diğer kullanıcılar için hızlı bir pasaj arayan çok iyi (inanılmaz derecede iyi çalışıyor). –

1
ContentResolver cr = mContext.getContentResolver(); Cursor cursor= mContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, PROJECTION, "HAS_PHONE_NUMBER <> 0", null, null); if (cursor!= null) { final int displayNameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); final int numberIndex = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER); final int idIndex= cursor.getColumnIndex(ContactsContract.Contacts._ID); String displayName, number = null, idValue; while (cursor.moveToNext()) { 
    displayName = cursor.getString(displayNameIndex); 
    idValue= cursor.getString(idIndex); 
    Cursor phones = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, "contact_id = '" + idValue + "'", null, null); 
    phones.moveToFirst(); 
    try { 
    number = phones.getString(phones.getColumnIndex("data1")); 
    } 
    catch (CursorIndexOutOfBoundsException e) 
    {` 
    } 
    phones.close(); 
    userList.add(new ContactModel(displayName , number , null , }