在 android 30 中建议使用结构化查询参数。 我想将 QUERY_ARG_SQL_GROUP_BY 与
ContentResolver
一起使用,但它不起作用。
我正在运行以下查询来获取
MIMETYPE
等于 ntactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE
或 ntactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
的数据行。
在数据表中,如果联系人有电子邮件和电话号码,我们会得到两行具有相同的
CONTACT_ID
。
现在我想使用 Group BY CONTACT_ID
但它不起作用。
选择和排序按预期工作,但分组依据不起作用我必须编写 for 循环来删除具有相同 CONTACT_ID
的行。
val projection =
arrayOf(
ContactsContract.Data.MIMETYPE,
ContactsContract.Data.CONTACT_ID,
ContactsContract.Data.DATA1,
ContactsContract.Data.DISPLAY_NAME
)
val selectQuery =
"""
${ContactsContract.Data.MIMETYPE} IN (
'${ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE}',
'${ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE}'
)
""".trimIndent()
val sortOrder =
"""
${ContactsContract.Data.DISPLAY_NAME} GLOB '[A-Za-z]*' DESC,
LTRIM(LTRIM(${ContactsContract.Data.DISPLAY_NAME}, '.'), '_')
COLLATE NOCASE
"""
val bundle = Bundle().apply {
putString(ContentResolver.QUERY_ARG_SQL_SELECTION, selectQuery)
putString(ContentResolver.QUERY_ARG_SQL_SORT_ORDER, sortOrder)
// This is not working.
putString(ContentResolver.QUERY_ARG_SQL_GROUP_BY, ContactsContract.Data.CONTACT_ID)
}
context.contentResolver.query(ContactsContract.Data.CONTENT_URI, projection, bundle, null)
GROUP BY
子句应位于ORDER BY
子句之前
所以尝试一下
putString(ContentResolver.QUERY_ARG_SQL_SELECTION, selectQuery)
putString(ContentResolver.QUERY_ARG_SQL_GROUP_BY, ContactsContract.Data.CONTACT_ID)
putString(ContentResolver.QUERY_ARG_SQL_SORT_ORDER, sortOrder)
QUERY_ARG_SQL_GROUP_BY 必须得到内容提供者的支持,而联系人提供者似乎并非如此。