Android managedQuery查询如果加入group by条件(及其猥琐的方法)-阿里云开发者社区

开发者社区> 叶林森> 正文

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

简介: 下午研究了很久都没有找到如何在managedQuery方法里面加入group by 条件最后灵机一动! 想出了一个及其猥琐的方法解决此问题! 此时我的需求是查出Calllog中的号码!相同的自然只出一个结果! 正常的查询是这样的! Cursor phoneCursor = this.
+关注继续查看
下午研究了很久都没有找到如何在managedQuery方法里面加入group by 条件最后灵机一动!
想出了一个及其猥琐的方法解决此问题!

此时我的需求是查出Calllog中的号码!相同的自然只出一个结果!
正常的查询是这样的!

Cursor phoneCursor = this.managedQuery(CallLog.Calls.CONTENT_URI ,
					new String[] { CallLog.Calls.NUMBER,
							CallLog.Calls.CACHED_NAME, CallLog.Calls.TYPE },
							 null, null, CallLog.Calls.DEFAULT_SORT_ORDER);
			phoneCursor.moveToFirst();
			while (phoneCursor.getPosition() != phoneCursor.getCount()) {
				String number = phoneCursor.getString(phoneCursor
						.getColumnIndexOrThrow(CallLog.Calls.NUMBER));
				String name = phoneCursor.getString(phoneCursor
						.getColumnIndexOrThrow(CallLog.Calls.CACHED_NAME));
				Log.e(TAG, "name:" + name + "number:" + number);
				phoneCursor.moveToNext();
			}

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


错误出现了
01-08 09:08:25.380: ERROR/DatabaseUtils(334): Writing exception to parcel
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
01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91)
01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64)
01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80)
01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:46)
01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:330)
01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at com.android.providers.contacts.CallLogProvider.query(CallLogProvider.java:130)
01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.content.ContentProvider$Transport.bulkQuery(ContentProvider.java:150)
01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:111)
01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at android.os.Binder.execTransact(Binder.java:288)
01-08 09:08:25.380: ERROR/DatabaseUtils(334):     at dalvik.system.NativeStart.run(Native Method)
01-08 09:08:25.390: WARN/dalvikvm(1347): threadid=1: thread exiting with uncaught exception (group=0x40020800)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347): FATAL EXCEPTION: main
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
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:158)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:330)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.content.ContentProviderProxy.query(ContentProviderNative.java:366)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.content.ContentResolver.query(ContentResolver.java:245)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.app.Activity.managedQuery(Activity.java:1520)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at com.test.CopyOfTests.onClick(CopyOfTests.java:68)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.view.View.performClick(View.java:2408)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.view.View$PerformClick.run(View.java:8816)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.os.Handler.handleCallback(Handler.java:587)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.os.Looper.loop(Looper.java:123)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at android.app.ActivityThread.main(ActivityThread.java:4627)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at java.lang.reflect.Method.invokeNative(Native Method)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at java.lang.reflect.Method.invoke(Method.java:521)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
01-08 09:08:25.390: ERROR/AndroidRuntime(1347):     at dalvik.system.NativeStart.main(Native Method)

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

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

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

SELECT number, name, type FROM calls WHERE (1=1) group by number --() ORDER BY date DESC

于是我成了的加入了group by查询
Cursor phoneCursor = this.managedQuery(CallLog.Calls.CONTENT_URI ,
					new String[] { CallLog.Calls.NUMBER,
							CallLog.Calls.CACHED_NAME, CallLog.Calls.TYPE },
							 "1=1) group by "+CallLog.Calls.NUMBER+" -- (", null, CallLog.Calls.DEFAULT_SORT_ORDER); 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10099 0
Android managedQuery查询如果加入group by条件(及其猥琐的方法)
下午研究了很久都没有找到如何在managedQuery方法里面加入group by 条件最后灵机一动! 想出了一个及其猥琐的方法解决此问题! 此时我的需求是查出Calllog中的号码!相同的自然只出一个结果! 正常的查询是这样的! Cursor phoneCursor = this.
603 0
Android 号码查询性能优化
我的需求是做一个快速拨号界面!list列表显示所有联系人Calllog资料!原来的做法在前面的日志中有提到!大概是先查 Cursor phoneCursor = this.managedQuery( ContactsContract.
531 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13895 0
嵌入式linux、QT、ARM、android研发学习交流,软考嵌入式系统设计师交流群,欢迎大家加入,群号95388240
 嵌入式linux、QT、ARM、android研发学习交流,软考嵌入式系统设计师交流群,欢迎大家加入,群号95388240
900 0
【黑马Android】(05)短信/查询和添加/内容观察者使用/子线程网络图片查看器和Handler消息处理器/html查看器/使用HttpURLConnection采用Post方式请求数据/开源项目
<h1>备份短信和添加短信</h1> <p></p> <p>操作系统短信的uri: content://sms/</p> <pre code_snippet_id="1644588" snippet_file_name="blog_20160413_1_3407084" name="code" class="html">&lt;?xml version="1.0" encoding=
1777 0
+关注
叶林森
浙江七巧板信息科技股份有限公司 技术VP/CTO,十年编程经验,七年管理经验,09年开始做Android,历经Android App,DELL手机系统,DELL平板系统,GM车载系统的开发,13年加入移动互联网创业大军,连续创业者,目前主攻JAVA架构,搜索引擎,大数据储存。
68
文章
13
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载