2011-02-03 6 views
0

android.i의 장치에서 모든 전화 연락처를 가져 오려면 다음 code.but를 사용했지만 결과를 반환하는 데 더 많은 시간이 필요합니다. 해결책이 있습니까?안드로이드의 연락처

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^2 개의 다른 데이터베이스 트랜잭션에서 n^3 복잡성이 있습니다. 거의 모든 데이터베이스를 단일 데이터베이스 쿼리로 처리 할 수 ​​있습니다. – Falmarri

답변

2

코드를 읽은 후 원하는 것은 DISPLAY NAMES와 해당 전화 번호가있는 연락처 목록입니다.

특히 전화 번호 관련 데이터를 찾으려면 android.provider.ContactsContract.PhoneLookup에서 쿼리하고 단일 커서를 사용하여 결과를 가져와야합니다.

는 예를 들어

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,... 

더 자세한 사항은 가정 인 경우 this

가 귀하의 요구 사항을 게시하시기 바랍니다 참조하십시오 DISPLAY_NAME HAS_PHONE_NUMBER 번호 TYPE : 다음 은 당신이 관심을 가질만한 분야입니다 사실이 아니다.

  • 빠른 검사의 일부 :

    1. 선택, 필요한 칼럼 만이 아니라 모든 첫 번째 쿼리한다. 대신 사용 cur.getInt을()있는 Integer.parseInt (cur.getString)를 사용
    2. 사용 PhoneLookup 전화 번호 (숫자 필드 에 저장된 값 대신 원시 전화 번호 를 제공 다루는 때마다
      -,) (첨부)
    3. 커서 안에 커서를 사용하지 마십시오. 이미 구현 된 개의 조인을 포함하는 API를 RawContactsEntity, PhoneLookup과 같이 사용하십시오.

희망이 있습니다.

0

UI 스레드에서 복잡한 데이터베이스 쿼리를 수행하지 마십시오. 결과로 무엇을하려합니까? 목록에있는 항목을 표시하는 경우 CursorAdapter을 사용하면 필요할 때 필요한 항목 만 빼낼 수 있습니다.