我正在尝试从联系人中查询昵称和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.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_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());
}
答案 0 :(得分:1)
如documentation所述,不同MIMETYPE的联系人详细信息存储在一个联系人数据表的不同记录中,并与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());
要以列表的形式显示来自两个不同mimetypes的数据,可以使用两列GridView ,如果设置了正确的排序(首先是contactId,然后是mimetype)。
如果需要完整行自定义,您可以创建包含sip-nick对的简单对象的ArrayList,使用来自contactId排序的两个cusors(nick和sip)的数据填充它,然后使用Array adapter在listview中显示它们。
或者,您可以在自定义适配器中加载两个游标:用于昵称和sipnumbers。例如,扩展SimpleCursorAdapter,将另一个游标沿基本光标传递到其构造函数中。然后在newView / bindView中,您可以在附加游标中执行查找并获取相应的数据。