私はAndroid開発の初心者です。電話のテキストメッセージを読むための簡単なアプリケーションを実行しています。コンテンツ プロバイダーの content://sms に関する問題がいくつあるかは知っていますが、カスタム プロバイダーを作成するのは難しすぎるので、とりあえずそれを使用します。
問題: content://sms/inbox を照会すると、すべてのメッセージが取得されるため、それらを ListActivity にリストしようとすると、メッセージごとに同じ連絡先が繰り返されます。基本的にこれは正しいです。理解していますが、「より専門的な」何か他のものが必要です。まず第一に: 1- 携帯電話では非常に大きなクエリに時間がかかります。 2- 明らかに、すべてのメッセージをこのようにリストしても意味がありません。
最も単純なことは、DISTINCT を使用するか、そうでない場合は、すべてのメッセージ、GROUP BY を再度クエリするため、非常に悪いことです。問題は、GROUP BY が認識されないことです。正しくは、コンテンツ プロバイダーの背後にあるものは、DB とは異なる可能性があるためです。どうやら DISTINCT は受け入れられますが、使用しても違いはありません。メッセージのクエリを取得した後、メッセージを自分でフィルタリングせずに解決策を見つけるために、3日間おかしくなりました。
これは、クエリを実行しようとするコードの小さくて単純な部分です。 List smsList = new ArrayList();
Uri uri = Uri.parse("content://sms/inbox");
String order = new String("date DESC");
String[] projection = new String[]{"DISTINCT thread_id, address, body, _id"};
String selection = new String("GROUP BY address"); //this doesn't work
Cursor c = getContentResolver().query(uri, projection, null, null, order);
// Read the sms data and store it in the list
if(c.moveToFirst()) {
for( i=0; i < c.getCount(); i++) {
SMSData sms = new SMSData();
sms.setBody(c.getString(c.getColumnIndexOrThrow("body")).toString());
sms.setNumber(c.getString(c.getColumnIndexOrThrow("address")).toString());
sms.setId(c.getString(c.getColumnIndexOrThrow("_id")).toString());
sms.setPersonName(getContactNameFromNumber(sms.getNumber()));
smsList.add(sms);
//Log.v(TAG,"il nome è: "+smsList.get(i).getPersonName()+" e il numero è: "+smsList.get(i).getNumber());
c.moveToNext();
}
}
c.close();
誰かが私を助けてくれることを願っています!前もって感謝します。