Java Android-从SMS ContentProvider检索数据-分组依据

Java Android-从SMS ContentProvider检索数据-分组依据,java,android,sql,Java,Android,Sql,我正在开发一个SMS应用程序,使用GROUPBY子句从ContentProvider检索数据时遇到了一些问题 我读过很多类似问题的线索,但它们仍然不能为我提供有效的解决方案 我想要的,是从每个线程获取最新的短信。要实现这一点,我必须选择DATE列的最大值,并按线程ID对其进行分组,我相信 假设SMS表如下所示: ============================ THREAD_ID | MESSAGE | DATE | ============================ 1

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

我读过很多类似问题的线索,但它们仍然不能为我提供有效的解决方案

我想要的,是从每个线程获取最新的短信。要实现这一点,我必须选择DATE列的最大值,并按线程ID对其进行分组,我相信

假设SMS表如下所示:

============================ THREAD_ID | MESSAGE | DATE | ============================ 1 | Hello | 555 1 | Hi | 666 2 | Test | 333 2 | Test 2 | 999
提前感谢您,如果您能帮助我找到此案例的解决方案,我将不胜感激。

GROUP BY子句被忽略,因为SELECT在代码中仅给出1个值

我不太懂SQL,但我认为这应该可以正常工作,因为我不知道确切的语法

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

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

执行如下操作

}

    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");
    }
SELECT thread, message, MAX(date)
FROM sms
GROUP BY thread
@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;