2011-02-03 28 views
0

android.iのデバイスからすべての電話連絡先を取得したいのですが、次のコードを使用しました。しかし、問題を解決するまでに時間がかかります。連絡先android

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 seconds .. – Kakey

+0

ここでn^3の複雑さは、n^2の異なるデータベーストランザクションで発生します。単一のデータベースクエリでこれをほぼ確実に実行できます。 – Falmarri

答えて

2

コードを読んだあと、DISPLAY NAMESとそれぞれの電話番号の連絡先リストが必要だと思います。

特に電話番号に関連するデータをお探しの場合は、 android.provider.ContactsContract.PhoneLookupでクエリを行い、1つのカーソルを使用して結果を取得することをお勧めします。 次はあなたが興味がある分野です:仮定がある場合は、あなたの要件を投稿してください DISPLAY_NAME HAS_PHONE_NUMBER NUMBER TYPE

例えば

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

さらなる詳細はthis

を参照してください。違います。

  • 迅速なチェックのいくつか:

    1. セレクト必要な列のみではなく、すべての最初のクエリインチ
    2. の代わりに(電話番号を扱う数 フィールドが生電話番号 の代わりに格納された値が得られるたびにInteger.parseInt(cur.getString) cur.getIntを(使用)
    3. 使用PhoneLookupを使用して可能なデータベース
      - 、)(添付)
    4. カーソル内でカーソルを使用しないでください。既に実装されている の結合を含むAPIを使用してください。 RawContactsEntity、PhoneLookup。

希望するものがあります。

0

UIスレッドで複雑なデータベースクエリを実行しないでください。あなたは結果をどうしようとしていますか?リストにあるものを表示する場合は、CursorAdapterを使用して、必要なときに必要なものだけを取り出すことができます。