3

Androidの連絡先コンテンツプロバイダーに電話番号のリストを照会して、そのリストのアイテムと一致する電話番号を持つ連絡先を取得する方法を理解しようとしています。ストレートSQLでは、次のようなものを使用します。

SELECT * FROM PHONES WHERE NUMBER IN ('1234','1235')

CP APIを使用しているので、何かが足りないようです。これはonCreateLoader()クエリのスニペットです。このクエリの結果で返されるレコードはありませんが、データベース内の連絡先にそれらの電話番号が存在することはわかっています。データベースに保存されている電話番号は次のようにフォーマットされているため、レコードが見つからないと思います。

+1 425-555-1212

IN()CPにクエリを実行し、フォーマットされていないデータに対してクエリリストを評価する方法があるかどうかはわかりません。onCreateLoader()クエリは次のとおりです。

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] projection = new String[] {    
            ContactsContract.CommonDataKinds.Phone._ID,
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.LABEL,
            ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY,
            ContactsContract.CommonDataKinds.Phone.NUMBER};
    return new CursorLoader(
            getActivity().getApplicationContext(), 
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            projection,
            ContactsContract.CommonDataKinds.Phone.NUMBER+" IN ('4255551212','4255551213')",
            null,
            null);
}

前のクエリの電話番号の1つで(以下に示すように)使用PhoneLookupすると、実際には正しい連絡先の一致が得られるため、これを行う方法が必要であると思います。残念ながら、PhoneLookup電話番号のリストを処理できるようには見えませんが、1つの電話番号しか処理できないようです。

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] projection = new String[] {
            ContactsContract.PhoneLookup._ID,
            ContactsContract.PhoneLookup.DISPLAY_NAME,
            ContactsContract.PhoneLookup.LABEL,
            ContactsContract.PhoneLookup.LOOKUP_KEY,
            ContactsContract.PhoneLookup.NUMBER};
    return new CursorLoader(
            getActivity().getApplicationContext(),
            Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode("4255551212")),
            projection,
            null,
            null,
            null);
}

これを達成する方法はありますか、それとも同じ結果をもたらす別の方法がありますか?結果は次のとおりです。

  • 電話番号のリストを指定して、リストに電話番号があるすべての連絡先を選択します

助言がありますか?

4

1 に答える 1

4

まず、に複数の電話番号を追加する方法はないと思いますContactsContract.PhoneLookup

第二に、あなたが言ったように、格納されている数値ContactsContract.CommonDataKinds.Phoneは通常フォーマットされています。2 つの電話番号が等しいかどうかを判断する方法は、 PhoneNumberUtils.compare(String num1, String num2) に基づいています。ここにあるソース コードを読むと、数値のバリエーションのリストを生成し、それらすべてをIN ('num1', 'num2', ...)

検索する数が多い場合 (つまり、連絡先全体のサイズとほぼ同じ)、すべての NUMBER と必要なデータをクエリContactsContract.CommonDataKinds.Phoneして、HashMap<NumberString, TheDataYouWant>. (その前にNumberString、文字列を保持するクラスを作成し、メソッドをオーバーライドしてcompareTo()return にする必要がありますPhoneNumberUtils.compare(this.string, anotherNumber.string);)。その後、HashMap.

于 2012-08-20T21:08:41.883 に答える