Android - 从SMS ContentProvider - GROUP BY中检索数据

时间:2012-02-19 20:28:46

标签: java android sql

我正在开发一个SMS应用程序,我遇到了一些使用GROUP BY子句从ContentProvider检索数据的问题。

我已经阅读了许多相似问题的主题,但他们仍然没有为我提供有效的解决方案。

我想要的是从每个帖子获取最新的短信。为了实现这个目标,我必须选择DATE列的最大值,并将其分组为THREAD_ID,我相信。

假设SMS表如下所示:

============================
THREAD_ID | MESSAGE | DATE |  
============================
1         | Hello   | 555                    
1         | Hi      | 666
2         | Test    | 333
2         | Test 2  | 999

结果应该返回:

1 - Hi - 666
2 - Test 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");
    }

提前感谢您,如果您能帮我找到解决此案的方法,我将非常感激。

3 个答案:

答案 0 :(得分:0)

GROUP BY子句被忽略,因为SELECT只给出了1个值(在你的代码中)。

我不太了解SQL,但我认为这应该有用(sry,我不知道确切的语法)

SELECT thread, message, MAX(date)
FROM sms
GROUP BY thread

答案 1 :(得分:0)

使用像CPH here这样的库来为您完成所有样板操作。示例代码显示了您需要的所有查询内容。

答案 2 :(得分:0)

实施如下

public Cursor query (SQLiteDatabase db, String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, 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;

}