1

すべての連絡先の表示名と電話番号の両方を取得しようとしていますが、番号のある行のみを返したいと思っています。

現在、私はこのようにしていますが、動作します:

ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,null, null, ContactsContract.Contacts.DISPLAY_NAME+ " COLLATE NOCASE");
while (cur.moveToNext()) 
{           
    if ( Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
    {
                        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                        String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));                    
                        contacts[index] = name;                                 

                        Cursor pCur = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);
                        pCur.moveToFirst();                                 
                        numbers[index] = pCur.getString( pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        index++;
                        pCur.close();
        }

cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);問題は、 400回ほど実行されているため、ロードに4〜5秒かかることです。


私の理解では、連絡先の名前と番号は異なるテーブルに保持されており、番号を取得するには名前の ID が必要です。

これを他の方法でより速く行うことはできますか?

前もって感謝します

4

2 に答える 2

5

@mixkatもう1つの解決策を見つけました。

1つのクエリを使用して名前と電話のデータを取得することが可能です。

コードは次のとおりです。

    String WHERE_CONDITION = ContactsContract.Data.MIMETYPE + " = '" +   ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'";
    String[] PROJECTION = {ContactsContract.Data.DISPLAY_NAME, ContactsContract.Data.DATA1};
    String SORT_ORDER = ContactsContract.Data.DISPLAY_NAME;

    Cursor cur = context.getContentResolver().query(
            ContactsContract.Data.CONTENT_URI,
            PROJECTION,
            WHERE_CONDITION,
            null,
            SORT_ORDER);

この場合、連絡先プロバイダーではなくデータプロバイダーに直接クエリを実行します。

于 2011-04-28T14:35:48.647 に答える
1

私も同じ問題を抱えてる。ユーザーが初めて開いたアプリで連絡先をdbに保存することで解決しました。そして、私がデータを更新するよりも (アプリがいつ連絡先を更新するかはあなた次第です)。

したがって、アプリケーションは、名前と番号が 1 つの行にあるデータベース テーブルの連絡先を使用します。時間がかかりません。

于 2011-03-30T12:27:40.420 に答える