我是Android开发的新手。 我正在做一个简单的应用程序来阅读手机的短信。 我知道内容提供商的内容有多少问题://短信但是......我写一个自定义的内容太难了,所以我暂时会使用它。
问题:当我查询内容时:// sms / inbox我得到了所有消息,所以当我尝试在ListActivity中列出它们时,我对他/她拥有的每条消息重复了相同的联系。基本上这是正确的,我理解它,但我需要别的东西,“更专业”的东西。 首先是因为: 1-一个如此大的查询需要很长时间在手机上 2-显然它没有任何意义,所有的消息都以这种方式列出。
最简单的事情是使用DISTINCT或......如果没有,但非常糟糕,因为它再次查询所有消息,即GROUP BY。问题是:GROUP BY无法识别,因为正确地说,内容提供商背后的内容可能与数据库有所不同。显然DISTINCT已被接受但如果使用则不会有任何差异。 在获得查询后,我一直疯狂地寻找解决方案而没有自己过滤消息。
这是我尝试进行查询的一小段简单代码: 列出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();
我希望有人可以帮助我! 提前谢谢。
答案 0 :(得分:0)
您必须使用GROUP BY thread_id
,查看我的github存储库SmsMessenger中的更多详细信息,您可以通过以下查询获取它:
cursor = MyApplication.getContext().getContentResolver().query(Uri.parse("content://sms")
, null
, "address IS NOT NULL) GROUP BY (thread_id"
, null
, null);