1

連絡先からニックネームと SIP アドレスを照会しようとしています。私が直面している問題は、両方が DATA1 列に格納されていることです。したがって、クエリを実行すると、ニックネームのみが取得されます。それらの両方を取得してSimpleCursorAdapter以下に渡す方法は何ですか?

CursorLoader c = new CursorLoader(getActivity(), baseUri, CONTACTS_NUMBER_PROJECTION2, Data.MIMETYPE+" ='" + Nickname.CONTENT_ITEM_TYPE+"'", null, ORDER);

private static final String[] CONTACTS_NUMBER_PROJECTION2 = new String[] {
SipAddress.DISPLAY_NAME,
SipAddress.SIP_ADDRESS,
BaseColumns._ID};

を使用し、とはSimpleCursorAdapterどちらもニックネームです。Nickname.NAMESipAddress.SIP_ADDRESS

SimpleCursorAdapter adapter = new SimpleCursorAdapter(getActivity(), R.layout.contact_list, null,  
                          new String[] {Nickname.NAME, SipAddress.SIP_ADDRESS},
                          new int[] {R.id.text1, R.id.text2}, 0);

スクリーンショットはこんな感じ。小さいフォントは Sip アドレスです。

に変更Nickname.CONTENT_ITEM_TYPEするSipAddress.CONTENT_ITEM_TYPEと、ニックネームの代わりに Sip アドレスが表示されます。両方を表示する方法がわかりません。

ここに画像の説明を入力

アップデート:

Nickname.NAME と SipAddress.SIP_ADDRESS をそれぞれ Nickname.DATA7 と Nickname.DATA* に変更しました。selectionArgs に「null」を追加しました。実際には、ニックネームと一口アドレスの両方が表示されますが、同じ行には表示されません。

ここに画像の説明を入力

更新 2:

sip とニックネームの値を StructuredName.DISPLAY_NAME と StructuredName.GIVEN_NAME の下に保存し、それらをアダプターにロードしました。selectionArgs を Data.MIMETYPE+" ='" + StructuredName.CONTENT_ITEM_TYPE+"'" に変更します

これが結果でした: ここに画像の説明を入力

 if (key.equals("alias")) {
                            contacts.add(ContentProviderOperation
                                    .newInsert(
                                            ContactsContract.Data.CONTENT_URI)
                                    .withValueBackReference(
                                            ContactsContract.Data.RAW_CONTACT_ID,
                                            0)
                                    .withValue(
                                            ContactsContract.Data.MIMETYPE,
                                            ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                                    .withValue(
                                            ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
                                            userDict.get(key).toString())
                                    .build());
                        }
if (key.equals("sipExt")) {
                            contacts.add(ContentProviderOperation
                                    .newInsert(
                                            ContactsContract.Data.CONTENT_URI)
                                    .withValueBackReference(
                                            ContactsContract.Data.RAW_CONTACT_ID,
                                            0)
                                    .withValue(
                                            ContactsContract.Data.MIMETYPE,
                                            ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                                    .withValue(
                                            ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
                                            userDict.get(key).toString())
                                    .build());
                        }
4

1 に答える 1

1

ドキュメントにあるように、異なる MIMETYPE の連絡先の詳細は、1 つの連絡先データ テーブルの異なるレコードに格納され、contactId と 1 対 1 の関係があります。そのため、1 つのカーソル行で SIP 番号とニックネームを取得することは事実上不可能です (と思います)。

これがデータベーススキームのフラグメントですBreatheInMyVoid / habrahabr.ruの礼儀

2 つの StructuredName 値を挿入するには、単一の挿入を使用する必要があります。

    contacts.add(ContentProviderOperation
                                .newInsert(
                                        ContactsContract.Data.CONTENT_URI)
                                .withValueBackReference(
                                        ContactsContract.Data.RAW_CONTACT_ID,
                                        0)
                                .withValue(
                                        ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                                .withValue(
                                        ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
                                        currentNickName)
                                .withValue(
                                        ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
                                        currentSipNo)
                                .build());

2 つの異なる MIME タイプからのデータをリスト形式で表示するには、正しい順序付け (まず contactId、次に MIME タイプ) が設定されている場合、 2 列の GridViewを使用できます。

完全な行のカスタマイズが必要な場合は、sip-nick ペアを含む単純なオブジェクトの ArrayList を作成し、contactId で並べ替えられた 2 つの cusor (nick と sip) からのデータを使用して入力し、配列アダプターを使用してそれらをリストビューに表示できます。

別の方法として、カスタム アダプターに2 つのカーソル (ニックネームと sipnumbers ) をロードすることもできます。たとえば、SimpleCursorAdapter を拡張し、ベース カーソルに沿って別のカーソルをそのコンストラクターに渡します。次に、 newView / bindView で、追加のカーソルでルックアップを実行し、対応するデータを取得できます。

于 2013-05-20T14:01:01.790 に答える