2011-10-18 28 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

2つのurisを使って結合クエリを作成する方法は? AFAIK電話番号はそれぞれのテーブルに格納されており、個別に照会する必要があります。 – erdomester

+0

この質問をご覧ください:http://stackoverflow.com/questions/4957009/how-do-i-join-two-sqlite-tables-in-my-android-application – Drejc