2011-10-18 5 views
1

내 전화에있는 모든 연락처를 배열에 넣고 싶습니다. 아래 코드를 사용하고 있지만 배열에 모두 넣으려면 3-4 초가 걸립니다. 프로세스를 가속화하기 위해 전화 번호가있는 연락처 만 수집합니다. 결과적으로 163 개의 요소가 배열됩니다.Android 연락처 콘택트 천천히 연락처

final String[] projection1 = new String[] {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, 
       ContactsContract.Contacts.HAS_PHONE_NUMBER}; 
     ContentResolver cr = getContentResolver(); 
     Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, projection1, null, null, null); 
     if (cur.getCount() > 0) 
     { 
      while (cur.moveToNext()) { 
       String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
       if (Integer.parseInt(cur.getString(cur.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()) { 
        number = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        contactnumbers.add(number); 

       } 
       pCur.close(); 
       } 
      } 
     }  

왜 이렇게 느린가요?

+0

내 경험에 따르면 ContactsContract는 에뮬레이터에서 매우 느리게 실행되는 것 같습니다. 장치에서 응용 프로그램을 시험해보고 더 빨리 실행되는지 확인하십시오. –

+0

내 전화로 시도하지 않았다면이 질문을 제기하지 않았을 것입니다. – erdomester

답변

1

쿼리 내에 쿼리가 있습니다. 두 문을 조인 할 때 조인 된 쿼리를 만들면 어떨까요? 아마도 현재의 솔루션보다 훨씬 빠를 것입니다.

+0

두 개의 uris로 조인 된 쿼리를 만드는 방법은 무엇입니까? AFAIK 전화 번호는 자체 테이블에 저장되어 있으므로 따로 쿼리해야합니다. – erdomester

+0

이 질문을보십시오 : http://stackoverflow.com/questions/4957009/how-do-i-join-two-sqlite-tables-in-my-android-application – Drejc