2012-02-19 11 views
0

私はSMSアプリケーションで作業していますが、GROUP BY句を使用してContentProviderからデータを取得する際に問題が発生しました。Androidから - データをSMSから取得するContentProvider - GROUP BY

私は同様の質問のスレッドをたくさん読んでいますが、まだ私のための解決策を提供していません。

私が欲しいのは、すべてのスレッドから最新のSMSを取得することです。これを実現するには、DATE列の最大値を選択し、それをTHREAD_IDでグループ化する必要があります。

 
============================ 
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を取得し

は、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"); 
    } 

ありがとうございました。このケースの解決策を見つけるお手伝いをさせていただきありがとうございます。

答えて

0

SELECTは1つの値(コード内)のみを与えるため、GROUP BY句は無視されます。

、私は非常によくSQL知りませんが、私は、これは動作するはずです(SRY、私は正確な構文を知らない)と思います

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

あなたのためのすべての定型のものを行うためにCPH hereのようなライブラリを使用します。サンプルコードには、必要なすべてのクエリが表示されます。

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; 

}を以下のように実装

関連する問題