2011-05-28 8 views
0

私のアプリでは大きなパフォーマンスの問題があります。 traceviewを経た後、私のアプリのパフォーマンスの大部分がカーソルによって消費されていることがわかりました。だから私は、デバイスの連絡先リストを扱うためのカーソルの代替があるのだろうかと思っていた。そして、代替手段がない場合は、カーソルを処理する方法を教えてください。そうすれば、アプリの処理速度が低下することはありません。Android - カーソルを使用せずに連絡先の名前と番号を取得する方法

お願いします。

ありがとうございました。

私のコードのこの部分では、パフォーマンス上の問題があります: -

public void getDisplayName() 
{  
    Cursor c1 = this.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

    String personName = null, number = null; 
    try 
    { 
     Log.e(TAG, "I am here!!"); 
     if(c1.getCount() > 0) 
     { 
      Log.e(TAG, "I am here2!!"); 
      while(c1.moveToNext()) 
      { 
       HashMap<String,String> item = new HashMap<String,String>(); 
       String id = c1.getString(c1.getColumnIndex(Contacts._ID)); 
       personName = c1.getString(c1.getColumnIndex(Contacts.DISPLAY_NAME)); 
       item.put("Name", personName); 
       Cursor cur = this.getContentResolver().query(CommonDataKinds.Phone.CONTENT_URI, null, CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); 
       while(cur.moveToNext()) 
       { 
        Log.e(TAG, "I am here!!3"); 
        number = cur.getString(cur.getColumnIndex(CommonDataKinds.Phone.NUMBER)); 
        item.put("Number", number); 
       } 
       displayName.add(item);   
      } 
     } 
    } 
    finally 
    { 
     c1.close(); 
    } 
} 
+0

私の知る限りでは、これを行うための別の良い方法はありません。私は、カーソルでパフォーマンスの問題に遭遇していません。たぶんそこに不必要なコードがありますか?投稿すると、誰かが問題を発見するかもしれない。 – Geobits

+0

パフォーマンスの問題があるコードパスを教えてください。 –

答えて

1

カーソルを使用せずに連絡先の名前と番号を取得する方法は?

これはできません。

私のアプリでは大きなパフォーマンスの問題があります。

N + 1個のクエリを使用するのではなく、N個のクエリによって返される行の数を使用します。これにより、単一のクエリを実行するだけの場合に比べてパフォーマンスが低下することが保証されます。

あなたは電話番号と一緒にユーザーの名前と_IDを得ることができます:値が変化したことがないので、

String[] PROJECTION=new String[] { Contacts._ID, 
             Contacts.DISPLAY_NAME, 
             Phone.NUMBER 
             }; 
    Cursor c=a.managedQuery(Phone.CONTENT_URI, PROJECTION, null, null, null); 

また、ループ内でgetColumnIndex()を呼び出すことはありません。

+0

あなたはGENIUSです。 – Varundroid

+0

@CommonsWare:display_name、number + emailの両方が必要な場合。最高のクエリは何ですか?私はどのクエリがこれらの両方を得ることができるのか分かりません。そして、カーソル結合子を使用する方法がわからない。あなたが私に指示を与えることができればとても親切です。現在、私はcontact_idを取得し、2つのカーソルを作成して番号と電子メールを探します。だからパフォーマンスが悪いです[私の質問](http://stackoverflow.com/questions/10811801/effective-way-to-get-contacts-info-with-photo) –

0

私は同じコードに取り組んでいたと私は、電子メールと電話番号を必要とする両方の最初のアプローチでは612人の連絡先を取得するために約35秒かかりました、私はそれを最適化するとき、それは612件の連絡先

私のコードを取得するために2秒かかりました。

ContentResolver cr = context.getContentResolver();

String[] projection = new String[] { Contacts.DISPLAY_NAME, Phone.NUMBER }; 

    String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ?"; 
    String[] selectionArgs = { String.valueOf(1) }; 

    Cursor cur = cr.query(Phone.CONTENT_URI, projection, selection, selectionArgs, null); 

    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      String phNo = cur.getString(cur.getColumnIndex(Phone.NUMBER)); 
      ContactModel contactModel = new ContactModel(); 
      contactModel.setName(name); 
      contactModel.setPhoneNumber(phNo); 
      contactList.add(contactModel); 
     } 
    } 

    String[] projectionEmail = new String[] { Contacts.DISPLAY_NAME, Email.ADDRESS }; 

    String selectionEmail = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ?"; 
    String[] selectionArgsEmail = { String.valueOf(1) }; 

    Cursor curEmail = cr.query(Email.CONTENT_URI, projectionEmail, selectionEmail, selectionArgsEmail, null); 

    if (curEmail.getCount() > 0) { 
     while (curEmail.moveToNext()) { 
      String Emailname = curEmail.getString(curEmail.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      String email = curEmail.getString(curEmail.getColumnIndex(Email.ADDRESS)); 
      ContactModel contactModel = new ContactModel(); 
      contactModel.setName(Emailname); 
      contactModel.setEmailId(email); 
      contactList.add(contactModel); 
     } 
    } 

`

関連する問題