在Android中使用CursorLoader和GROUP BY

3
我正在尝试从ContactsContract.CommonDataKinds.Email.CONTENT_URI表中获取所有Contacts,并使用CursorLoader按它们的ContactIDName进行分组。
例如,如果联系人有2个电子邮件,则只会得到关于此联系人的一行。
基本上,它应该像这样进行:
SELECT ContactID, Name
FROM Table
GROUP BY ContactID, Name

我的代码:

String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE '')) 
GROUP BY ((" + ContactsContract.CommonDataKinds.Email.CONTACT_ID + ", display_name";

final static String[] PROJECTION =
{
   Utils.hasHoneycomb() ? Contacts.DISPLAY_NAME_PRIMARY : Contacts.DISPLAY_NAME,
   ContactsContract.CommonDataKinds.Email.CONTACT_ID,
};

return new CursorLoader(getActivity(),
                    ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                    ContactsQuery.PROJECTION,
                    filter,
                    null,
                    ContactsQuery.SORT_ORDER);

我遇到了下一个SQLite错误:

"Caused by: android.database.sqlite.SQLiteException: near ",": syntax error: , while compiling: SELECT DISTINCT display_name, contact_id FROM view_data_restricted data WHERE (1 AND mimetype_id = 1) AND ((data1 NOT LIKE '')) GROUP BY ((contact_id, display_name)) ORDER BY sort_key"

所以这是我的查询:
SELECT DISTINCT display_name, contact_id FROM view_data_restricted data 
WHERE (1 AND mimetype_id = 1) AND ((data1 NOT LIKE '')) 
GROUP BY ((contact_id, display_name)) ORDER BY sort_key
  1. 为什么cursorLoader添加了"DISTINCT",是为什么?
  2. 我知道有多个"(" / ")"符号,这是我处理"GROUP_BY"的最佳方法。请问还有其他的想法可以帮忙吗?
  3. 我无法在","附近找到问题,如错误所述。

抱歉,我的错误。我编辑了我的回答。 - dipali
你找到解决方案了吗? - Meghal Shah
1
看这里: https://dev59.com/lWkv5IYBdhLWcg3wdQnm - joe1806772
@David。你找到这个问题的解决方案了吗? - Deepak Rathore
2个回答

1
问题在于CursorLoader如何构造查询语句。
根据this:
“GROUP BY”子句必须遵循WHERE子句中的条件,并且如果使用ORDER BY子句,则必须位于其前面。
不幸的是,如果你将Selection、Projection和SortOrder作为参数传递,那么你无法实现这一点。没有地方可以“hack”进“Group By”语句。

-1
select (SELECT  group_concat(DISTINCT display_name) FROM view_data_restricted) as a,(SELECT  group_concat(DISTINCT contact_id) FROM view_data_restricted) as b FROM view_data_restricted data 
WHERE (1 AND mimetype_id = 1) AND ((data1 NOT LIKE '')) 
GROUP BY ((contact_id, display_name)) ORDER BY sort_key

多列去重:

请参考此链接:

参考链接


希望这对你有用。 - dipali
抱歉,但我正在使用Android CursorLoader。CursorLoader构造函数中的第二个参数是表的Uri,“SELECT”部分由CursorLoader编写而不是我。我的上述查询有什么问题? - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接