Android managedQuery查询如果加入group by条件(及其猥琐的方法)

下午研究了很久都没有找到如何在managedQuery方法里面加入group by 条件最后灵机一动! 
想出了一个及其猥琐的方法解决此问题! 

此时我的需求是查出Calllog中的号码!相同的自然只出一个结果! 
正常的查询是这样的! 
Java代码   收藏代码
  1. Cursor phoneCursor = this.managedQuery(CallLog.Calls.CONTENT_URI ,  
  2.                     new String[] { CallLog.Calls.NUMBER,  
  3.                             CallLog.Calls.CACHED_NAME, CallLog.Calls.TYPE },  
  4.                              nullnull, CallLog.Calls.DEFAULT_SORT_ORDER);  
  5.             phoneCursor.moveToFirst();  
  6.             while (phoneCursor.getPosition() != phoneCursor.getCount()) {  
  7.                 String number = phoneCursor.getString(phoneCursor  
  8.                         .getColumnIndexOrThrow(CallLog.Calls.NUMBER));  
  9.                 String name = phoneCursor.getString(phoneCursor  
  10.                         .getColumnIndexOrThrow(CallLog.Calls.CACHED_NAME));  
  11.                 Log.e(TAG, "name:" + name + "number:" + number);  
  12.                 phoneCursor.moveToNext();  
  13.             }  

此方法达不到过滤号码相同的! 
于是首先想到的要过滤这个最好只在查询的时候就做查出结果后在遍历肯定效率存在问题! 
但managedQuery貌似没有提供group by的入口! 
首先想到的是在where 子句的入口 
Java代码   收藏代码
  1. Cursor phoneCursor = this.managedQuery(CallLog.Calls.CONTENT_URI ,  
  2.                     new String[] { CallLog.Calls.NUMBER,  
  3.                             CallLog.Calls.CACHED_NAME, CallLog.Calls.TYPE },  
  4.                              "group by CallLog.Calls.NUMBER"null, CallLog.Calls.DEFAULT_SORT_ORDER);  

错误出现了 
Java代码   收藏代码
  1. 01-08 09:08:25.380: ERROR/DatabaseUtils(334): Writing exception to parcel  
  2. 01-08 09:08:25.380: ERROR/DatabaseUtils(334): android.database.sqlite.SQLiteException: near "group": syntax error: , while compiling: SELECT number, name, type FROM calls WHERE (group by CallLog.Calls.NUMBER) ORDER BY date DESC  
  3. 01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)  
  4. 01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91)  
  5. 01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64)  
  6. 01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80)  
  7. 01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:46)  
  8. 01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)  
  9. 01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)  
  10. 01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:330)  
  11. 01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at com.android.providers.contacts.CallLogProvider.query(CallLogProvider.java:130)  
  12. 01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.content.ContentProvider$Transport.bulkQuery(ContentProvider.java:150)  
  13. 01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:111)  
  14. 01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.os.Binder.execTransact(Binder.java:288)  
  15. 01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at dalvik.system.NativeStart.run(Native Method)  
  16. 01-08 09:08:25.390: WARN/dalvikvm(1347): threadid=1: thread exiting with uncaught exception (group=0x40020800)  
  17. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347): FATAL EXCEPTION: main  
  18. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347): android.database.sqlite.SQLiteException: near "group": syntax error: , while compiling: SELECT number, name, type FROM calls WHERE (group by CallLog.Calls.NUMBER) ORDER BY date DESC  
  19. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:158)  
  20. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)  
  21. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:330)  
  22. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.content.ContentProviderProxy.query(ContentProviderNative.java:366)  
  23. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.content.ContentResolver.query(ContentResolver.java:245)  
  24. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.app.Activity.managedQuery(Activity.java:1520)  
  25. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at com.test.CopyOfTests.onClick(CopyOfTests.java:68)  
  26. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.view.View.performClick(View.java:2408)  
  27. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.view.View$PerformClick.run(View.java:8816)  
  28. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.os.Handler.handleCallback(Handler.java:587)  
  29. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.os.Handler.dispatchMessage(Handler.java:92)  
  30. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.os.Looper.loop(Looper.java:123)  
  31. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.app.ActivityThread.main(ActivityThread.java:4627)  
  32. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at java.lang.reflect.Method.invokeNative(Native Method)  
  33. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at java.lang.reflect.Method.invoke(Method.java:521)  
  34. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)  
  35. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)  
  36. 01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at dalvik.system.NativeStart.main(Native Method)  

看到这个错误后我很猥琐的想到了黑客的方法 
现在的查询语句是 
Java代码   收藏代码
  1. SELECT number, name, type FROM calls WHERE (group by CallLog.Calls.NUMBER) ORDER BY date DESC  

吧它改装一下 
Java代码   收藏代码
  1. SELECT number, name, type FROM calls WHERE (1=1)group by CallLog.Calls.NUMBER () ORDER BY date DESC  

后面那个()会出现错误那我一不做二不休 

Java代码   收藏代码
  1. SELECT number, name, type FROM calls WHERE (1=1) group by number --() ORDER BY date DESC  

于是我成了的加入了group by查询 
Java代码   收藏代码
  1. Cursor phoneCursor = this.managedQuery(CallLog.Calls.CONTENT_URI ,  
  2.                     new String[] { CallLog.Calls.NUMBER,  
  3.                             CallLog.Calls.CACHED_NAME, CallLog.Calls.TYPE },  
  4.                              "1=1) group by "+CallLog.Calls.NUMBER+" -- ("null, CallLog.Calls.DEFAULT_SORT_ORDER);   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值