CursorLoader / adapter未显示正确的值

时间:2013-05-20 12:26:46

标签: android contacts simplecursoradapter

我正在尝试从联系人中查询昵称和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};

使用SimpleCursorAdapterNickname.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地址而不是昵称。我不确定如何让两者都出现。

enter image description here

更新

我分别将Nickname.NAME和SipAddress.SIP_ADDRESS更改为Nickname.DATA7和Nickname.DATA *。为我的selectionArgs添加了'null'。我实际上确实得到了昵称和啜饮地址以显示但不在同一行:

enter image description here

更新2:

我将sip和昵称值存储在StructuredName.DISPLAY_NAME和StructuredName.GIVEN_NAME下,然后使用适配器加载它们。我将selectionArgs更改为Data.MIMETYPE +“='”+ StructuredName.CONTENT_ITEM_TYPE +“'”

这是结果: enter image description here

 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());
                        }

1 个答案:

答案 0 :(得分:1)

documentation所述,不同MIMETYPE的联系人详细信息存储在一个联系人数据表的不同记录中,并与contactId具有一对一的关系。因此,我认为在一个光标行中获取sip号和昵称实际上是不可能的。

这是数据库方案片段courtesy of 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());

要以列表的形式显示来自两个不同mimetypes的数据,可以使用两列GridView ,如果设置了正确的排序(首先是contactId,然后是mimetype)。

如果需要完整行自定义,您可以创建包含sip-nick对的简单对象的ArrayList,使用来自contactId排序的两个cusors(nick和sip)的数据填充它,然后使用Array adapter在listview中显示它们。

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