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”。实际上,我确实得到了昵称和 sip 地址,但不在同一行:

在此处输入图像描述

更新 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 的联系人详细信息存储在一个联系人数据表的不同记录中,并且与 contactId 具有一对一的关系。因此,几乎不可能(我认为)在一个光标行中获得 sip 号码和昵称。

这是数据库方案片段由 BreatheInMyVoid / habrahabr.ru 提供

要插入两个 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());

要以列表的形式显示来自两种不同 mimetype 的数据,可以使用两列 GridView ,前提是设置了正确的顺序(首先按 contactId,然后按 mimetype)。

如果需要行自定义,您可以创建包含 sip-nick 对的简单对象的 ArrayList,使用来自按 contactId 排序的两个 cusor(nick 和 sip)的数据填充它,然后使用 Array 适配器在列表视图中显示它们。

或者,您可以在自定义适配器中加载两个游标:用于昵称和 sipnumbers。例如,扩展 SimpleCursorAdapter,将另一个游标沿基本游标传递到其构造函数中。然后在 newView / bindView 中你可以在附加游标中执行查找并获取相应的数据。

于 2013-05-20T14:01:01.790 回答