我是Android的新手。 实际上,我想通过Content provider& amp ;;查询来自媒体提供商的数据。内容解析器。
c = mContent.query(CONTENT_URI,projection,where,null,null);
我的问题是,如何使用GROUP BY
子句查询媒体提供商的数据,如下所示:
select DISTINCT _id, count(_id), _data FROM aaa_table WHERE _data LIKE "A" OR _data LIKE "B" GROUP BY _id;
我已尝试按如下方式设置projection
和where
:
final String[] projection = new String[] {
"_id",
"COUNT ("+ _id +")" ,
"_data"
};
和where
:
_data LIKE "A" OR _data LIKE "B"
但是,我找不到如何设置查询选项GROUP BY _id
。
请帮帮我。
答案 0 :(得分:9)
where = "_data LIKE 'A' OR _data LIKE 'B'";
where += ") GROUP BY (_id"; // note the char ')' and '(', the ContentResover will completed for U
c = mContent.query(CONTENT_URI,projection,where,null,null);
答案 1 :(得分:4)
你不能来自ContentProvider
。现在,如果您正在撰写ContentProvider
,那么您可以实施它。在您的内容提供商中,您必须使用SQLiteQueryBuilder
类,其中query()
方法带有GROUP BY
字符串。
http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html
此类还有一个setDistinct(true)
方法,可以将查询设置为DISTINCT,正如您在SQL语句中指出的那样。
答案 2 :(得分:3)
我不确定是否可能。
我最近遇到了类似的问题,我设法通过将ContentProvider
中的数据插入临时表并查询表中的结果来解决问题。
故事是ContentProvider
背后的数据可能不是数据库。它可以是XML,JSON,FileSystem等......所以这些没有GROUP BY
选项,因此他们将其排除在外。你也不能总是认为count(_id)
会起作用。
答案 3 :(得分:1)
首先请原谅我的POOR英语! 我是Java / Android的新手,从4.2.1开始并且用了近2天的战斗,然后我开始阅读更多有关SQLiteQueryBuilder的详细信息query部分几乎是什么你正在寻找;)
它有:
public Cursor query (SQLiteDatabase db, String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder)
查询"功能"内容提供商只为您提供:
query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder)
在这里你可以欺骗我,我会发给你我的代码剪辑:
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
final SQLiteDatabase db = mOpenHelper.getReadableDatabase();
/* a String is a Object, so it can be null!*/
String groupBy = null;
String having = null;
switch (sUriMatcher.match(uri)) {
...
...
...
case EPISODES_NEXT:
groupBy = "ShowID";
queryBuilder.setTables(EpisodenTable.TableName);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
Cursor c = queryBuilder.query(db, projection, selection, selectionArgs,
groupBy, having, sortOrder);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
多数民众赞成!
这里是我用来执行的代码:
Cursor showsc = getContext().getContentResolver().query(
WhatsOnTVProvider.CONTENT_EPISODES_NEXT_URI,
EpisodenTable.allColums_inclCount,
String.valueOf(Calendar.getInstance().getTimeInMillis() / 1000)
+ " < date", null, null);
答案 4 :(得分:0)
这种方法对我有用: (我已经找到了解决方法here)
val projection = arrayOf(
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.MediaColumns.DATA
)
val selection = " 1=1 ) GROUP BY (${MediaStore.Images.Media.BUCKET_DISPLAY_NAME}"
val cursor = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
null,
null
)