Android 中管理短信(三)

2014-11-24 14:41:21 · 作者: · 浏览: 33
也太仁慈了。


看看能不能再挖掘一下sms的功能。先来做一个错误的查询:


getContentResolver().query( Uri.parse("content://sms/") , new String[]{"a"}, "b", null, null);


log输出错误的SQL语句:


SELECT a FROM sms WHERE (b) ORDER BY date DESC


query方法中没有Group by,如果想对短信做统计,对Cursor进行遍历再统计也太慢了。


在SQL语言中group by在Where后面,那就在条件参数中想想办法:


Android组织SQL语句时将条件两端加(),那就拼一个group by出来吧:


getContentResolver().query( Uri.parse("content://sms/") , new String[]{"count(*) as count, thread_id"}, "1=1) group by (thread_id", null, null);


那么输出的SQL= SELECT count(*) as count, thread_id FROM sms WHERE ( 1=1) group by (thread_id ) ORDER BY date DESC


如果想查询URI没有对应的表怎么办呢,比如想知道 mmssms.db数据库中有哪些表,


查询的表是URI定的,再在条件参数中拼凑肯定是不行。


那我们把目光往前移,看看在字段参数中能不能凑出来。


要查询其它表,关键要去掉系统固定添加的FROM sms,


用用SQL中的注释吧,


getContentResolver().query(Uri.parse("content://sms/"), new String[]{" * from sqlite_master WHERE type = 'table' -- "}, null, null, null);


那么输出的SQL=SELECT * from sqlite_master WHERE type = 'table' -- FROM sms ORDER BY date DESC


居然能够运行。


得寸进尺,再进一步,如果加入“;”也能运行的话,哈哈,那么建表、删除表、更新表也能为所欲为咯。


getContentResolver().query(Uri.parse("content://sms/"), new String[]{" * from sms;select * from thrreads;-- "}, null, null, null);


很可惜,只运行了第一条SQL语句,看来在关键问题上,android还是有所控制的。


不过支持--也很不错了,这样可以查询数据库中所有的表,而且还可以多表联查