如何使用 ContentResolver 将结构化查询参数用于 GROUP BY 查询

问题描述 投票:0回答:2

在 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)
android sqlite android-sqlite android-11
2个回答
0
投票

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)

参见 https://www.sqlite.org/lang_select.html


0
投票

QUERY_ARG_SQL_GROUP_BY 必须得到内容提供者的支持,而联系人提供者似乎并非如此。

© www.soinside.com 2019 - 2024. All rights reserved.