ContentResolver 的 query() 方法中的 group by 子句出错

Posted

技术标签:

【中文标题】ContentResolver 的 query() 方法中的 group by 子句出错【英文标题】:Error in group by clause in query() method of ContentResolver 【发布时间】:2014-03-03 02:35:16 【问题描述】:

我在使用以下查询时遇到错误。如何解决?

String projection[] = Data.CONTACT_ID,Data.DISPLAY_NAME,Phone.NUMBER,Data.RAW_CONTACT_ID,Email.DATA,Phone.DATA1,StructuredPostal.STREET,StructuredPostal.POSTCODE;

        Cursor c = getContentResolver().query(
                Data.CONTENT_URI, 
                projection, 
                "(" + Data.MIMETYPE + "=? OR " + Data.MIMETYPE + "=?) GROUP BY ?", 
                new String[]Email.CONTENT_ITEM_TYPE, Phone.CONTENT_ITEM_TYPE, Data.CONTACT_ID,
                Data.CONTACT_ID);

Logcat:

02-06 14:18:01.175: E/androidRuntime(6884): FATAL EXCEPTION: IntentService[ContactManagerService]
02-06 14:18:01.175: E/AndroidRuntime(6884): android.database.sqlite.SQLiteException: near "GROUP": syntax error: , while compiling: SELECT contact_id, display_name, data1, raw_contact_id, data1, data1, data4, data9 FROM view_data data WHERE (1) AND (((mimetype=? OR mimetype=?) GROUP BY ?)) ORDER BY contact_id
02-06 14:18:01.175: E/AndroidRuntime(6884):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:180)
02-06 14:18:01.175: E/AndroidRuntime(6884):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:136)
02-06 14:18:01.175: E/AndroidRuntime(6884):     at android.content.ContentProviderProxy.query(ContentProviderNative.java:358)
02-06 14:18:01.175: E/AndroidRuntime(6884):     at android.content.ContentResolver.query(ContentResolver.java:311)
02-06 14:18:01.175: E/AndroidRuntime(6884):     at com.ecosmob.contactpro.service.ContactManagerService.onHandleIntent(ContactManagerService.java:103)
02-06 14:18:01.175: E/AndroidRuntime(6884):     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
02-06 14:18:01.175: E/AndroidRuntime(6884):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-06 14:18:01.175: E/AndroidRuntime(6884):     at android.os.Looper.loop(Looper.java:137)
02-06 14:18:01.175: E/AndroidRuntime(6884):     at android.os.HandlerThread.run(HandlerThread.java:60)

【问题讨论】:

【参考方案1】:

实际上不可能将GROUP BYContentResolver 查询一起使用。曾经有一些parenthesis injection tricks 将GROUP BY 放在语法正确的位置,但这并不适用于所有平台版本。

此外,您可以将 ? 占位符仅用于文字,而不能用于列名等标识符。

考虑另一种方法,以您想要的方式获取所需的数据。

【讨论】:

我还可以使用哪些其他方法?我是新手,不知道该怎么做。我想要所有独特的contact_id 例如不带GROUP BY的查询并在代码中进行分组。【参考方案2】:

也许我在回答问题时为时已晚,但我对此有所好转。 ContentResolver 查询中的selection 是 where 子句,关闭后可用于 GROUP BY。

String selection = "(1) GROUP BY" COLUMN_NAME";
Cursor c = getContentResolver().query(uri,projection,selection,null,null);

这将按 COLUMN_NAME 对光标进行分组。

【讨论】:

以上是关于ContentResolver 的 query() 方法中的 group by 子句出错的主要内容,如果未能解决你的问题,请参考以下文章

Android contentResolver 进行query 条件为where in时出错

Android contentResolver 进行query 条件为where in时出错

contentResolver.query(ContactsContract.Contacts.CONTENT_URI...) 如果在 Intent.ACTION_INSERT 之后调用,则返回 0

Android之——ContentResolver查询的三种方式

getContentResolver().query()方法selection参数使用详解(转)

ContentResolver(一)