我正在开发一个SMS应用程序,在使用GROUP BY子句从ContentProvider检索数据时遇到了一些问题。
我读了很多类似问题的线索,但它们仍然没有为我提供一个有效的解决方案
我想要的,是从每个线程获得最新的短信。为了实现这一点,我必须选择DATE列的最大值,并根据THREAD_ID对其进行分组。
假设SMS表如下所示:
============================THREAD_ID |消息|日期|============================1|你好|5551|嗨|6662|测试|3332|测试2|999
结果应该返回:
1-嗨-6662-测试2 999
到目前为止,这就是我所拥有的,但下面的代码从整个表中检索最新的SMS,而不是从特定类别中检索。看起来GROUP BY子句被忽略了。
String CONTENT_URI = "content://sms/";
Uri uri = Uri.parse(CONTENT_URI);
String selection = "date=(SELECT max(date) FROM sms )";
selection+=") GROUP BY (thread_id";
Cursor c = managedQuery(uri, null, selection, null, null);
if (c != null) {
while (c.moveToNext()) {
textView.append(c.getString(c.getColumnIndex(Column.THREAD_ID))
+ " - " + c.getString(c.getColumnIndex(Column.ADDRESS))
+ " - " + c.getString(c.getColumnIndex(Column.READ))
+ " - " + c.getString(c.getColumnIndex(Column.BODY))
+ " - " + c.getString(c.getColumnIndex(Column.DATE))
+ "n");
}
c.close();
} else {
textView.setText("Cursor is null");
}
提前谢谢你,如果你能帮我找到这个案子的解决方案,我将不胜感激。
GROUP BY子句被忽略,因为SELECT(在代码中)只给出1个值。
我不太了解SQL,但我认为这应该有效(sry,我不知道确切的语法)
SELECT thread, message, MAX(date)
FROM sms
GROUP BY thread
在这里使用像CPH这样的库来为您做所有的样板工作。示例代码显示了您需要的所有查询内容。
实现如下
public Cursor查询(SQLiteDatabase数据库数据库,String[]项目In,字符串选择,String[]选择Args,字符串groupBy,字符串拥有,字符串排序顺序)
@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;
}