Android 游标加载程序/适配器未显示正确的值
我正试图从联系人中查询昵称和SIP地址。我遇到的问题是,它们都存储在DATA1列中。因此,当我运行查询时,我只检索昵称。检索它们并将它们传递到下面的Android 游标加载程序/适配器未显示正确的值,android,contacts,simplecursoradapter,Android,Contacts,Simplecursoradapter,我正试图从联系人中查询昵称和SIP地址。我遇到的问题是,它们都存储在DATA1列中。因此,当我运行查询时,我只检索昵称。检索它们并将它们传递到下面的SimpleCursorAdapter中的方法是什么 CursorLoader c = new CursorLoader(getActivity(), baseUri, CONTACTS_NUMBER_PROJECTION2, Data.MIMETYPE+" ='" + Nickname.CONTENT_ITEM_TYPE+"'", null, OR
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.NAME
和SipAddress.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\u ITEM\u TYPE
更改为SipAddress.CONTENT\u ITEM\u TYPE
我将获得Sip地址而不是昵称。我不知道怎样才能让两个人都出现
更新:
我将昵称.NAME和SipAddress.SIP_地址分别更改为昵称.DATA7和昵称.DATA*。为我的SelectionAgs添加了“null”。实际上,我会同时显示昵称和sip地址,但不会显示在同一行: 更新2: 我将sip和nick name值存储在StructuredName.DISPLAY_name和StructuredName.GIVEN_name下,然后用适配器加载它们。我将selectionArgs更改为Data.MIMETYPE+“=”+StructuredName.CONTENT\u ITEM\u TYPE+“” 结果是: 如上所述,不同mimetype的联系人详细信息存储在一个contacts数据表中的不同记录中,并且与contactId有一对一的关系。正因为如此,实际上不可能(我认为)在一个游标行中获得sip编号和昵称 下面是数据库方案片段 要插入两个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的数据,如果设置了正确的顺序(首先按contactId,然后按mimetype),则可以使用两列GridView
如果需要full行自定义,您可以创建包含sip nick pair的简单对象的ArrayList,使用contactId排序的两个CUsor(nick和sip)中的数据填充它,然后使用Array adapter在listview中显示它们
或者,您可以在自定义适配器中加载两个游标:用于昵称和数字。例如,扩展SimpleCursorAdapter,沿着基游标将另一个游标传递到其构造函数中。然后,在newView/bindView中,您可以在附加光标中执行查找并获得相应的数据。如前所述,不同MIMEType的联系人详细信息存储在一个contacts数据表中的不同记录中,并且与contactId有一对一的关系。正因为如此,实际上不可能(我认为)在一个游标行中获得sip编号和昵称
下面是数据库方案片段
要插入两个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的数据,如果设置了正确的顺序(首先按contactId,然后按mimetype),则可以使用两列GridView
如果需要full行自定义,您可以创建包含sip nick pair的简单对象的ArrayList,使用contactId排序的两个CUsor(nick和sip)中的数据填充它,然后使用Array adapter在listview中显示它们
或者,您可以在自定义适配器中加载两个游标:用于昵称和数字。例如,扩展SimpleCursorAdapter,沿着基游标将另一个游标传递到其构造函数中。然后,在newView/bindView中,您可以在附加光标中执行查找,并获取相应的数据。所以,请删除数据。MIMETYPE?未知列类型是指昵称.DATA5、昵称.DATA6等?是的。本例中未指定联系人提供程序的行为,但我们希望它是正常的。一个小实验,我将昵称.NAME和SipAddress.SIP_地址分别更改为昵称.DATA7和昵称.DATA*。为我的SelectionAgs添加了“null”。实际上,我会同时显示昵称和sip地址,但不在同一行。检查更新的问题,我添加了一个屏幕截图。这意味着不同mime类型的数据确实存储在不同记录的单个数据表中,通过mimetype键进行区分。然后,在单个列表视图行中混合sip编号和昵称的唯一方法是自定义适配器。我会编辑答案顺便问一下,如果多个sip nos(或很少)昵称连接到一个联系人id,你会怎么做?所以请删除Data.MIMETYPE?未知列类型是指昵称.DATA5、昵称.DATA6等?是的。本例中未指定联系人提供程序的行为,但我们希望它是正常的。一个小实验,我将昵称.NAME和SipAddress.SIP_地址分别更改为昵称.DATA7和昵称.DATA*。为我的SelectionAgs添加了“null”。实际上,我会同时显示昵称和sip地址,但不在同一行。检查更新的问题,我添加了一个屏幕截图。这意味着不同mime类型的数据确实存储在不同记录的单个数据表中,通过mimetype键进行区分。然后,在单个列表视图行中混合sip编号和昵称的唯一方法是自定义适配器。我会编辑答案顺便问一下,如果几个sip号(或很少)昵称连接到一个联系人id,你会怎么做?