Android之——ContentResolver查询的三种方式
Android 查询 方式 三种
2023-09-11 14:20:42 时间
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47785491
今天做到一个小项目。查询手机中短信的信息,当然得去系统暴露出来的数据库中去查询了,后来发现有三种方式能够选择,以下一一写出来。
1、方式一
第一种方式,採用 getContentResolver().query()方法在主线程中查询数据。这样的查询方式是不是异步查询的,直接在UI线程中查询数据,代码例如以下:
Cursor cursor1 = getContentResolver().query(Sms.CONVESATION_URI, CONVERSATION_PROJECTION,null, null," sms.date desc"); while (cursor1.moveToNext()) { Log.i("cursor1", String.valueOf(cursor1.getInt(0))); Log.i("cursor1", cursor1.getString(1)); Log.i("cursor1", cursor1.getString(2)); } cursor1.close();
2、方式二
另外一种查询方式。这样的查询相同是在UI线程中查询数据。只是这样的方式得到的Cursor不用手动去关闭,是Activity自己主动会去关闭的,cursor由activity去管理,代码例如以下:
Cursor cursor2 = managedQuery(Sms.CONVESATION_URI, CONVERSATION_PROJECTION, null, null, "sms.date desc"); while (cursor2.moveToNext()) { Log.i("cursor2", String.valueOf(cursor2.getInt(0))); Log.i("cursor2", cursor2.getString(1)); Log.i("cursor2", cursor2.getString(2)); }
3、方式三
第三种查询方式,这样的方式是利用Android提供的异步查询框架AsyncQueryHandler,/是一种异步查询方式,当单查询完成后。会调用onQueryComplete(token, cookie, cursor)通知查询完成,而且传回cursor。
代码例如以下:
private void startQuery() { Uri uri = Sms.CONVESATION_URI; mQueryHandler.startQuery(0, null, uri, CONVERSATION_PROJECTION, null, null, "sms.date desc"); } // 写一个异步查询类 private final class QueryHandler extends AsyncQueryHandler { public QueryHandler(ContentResolver cr) { super(cr); } @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { super.onQueryComplete(token, cookie, cursor); // 更新mAdapter的Cursor mAdapter.changeCursor(cursor); } }
Android开发中性能优化始终要谨记在心。所以假设数据量略微大点都要使用异步查询。尽量避免在UI线程中做耗时操作,而查询而言,利用Android提供好的异步查询框架是最适合的了。事实上AsyncQueryHandler也是封装了Handler来实现的。另一点,一般在查询本地的应用的数据的时候要去採用CursorAdapter。
相关文章
- [Android]中文API(三)android.account包下的那些类
- [android]android自动化测试四之Monkey与MonkeyRunner
- [Android Pro] 完美解决 No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
- [Android Pro] 常用的android工具类和库
- [Android Pro] android控件ListView顶部或者底部也显示分割线
- 【黑马Android】(01)android简介/工程目录结构/拨号器/四种点击事件/后台偷偷发短信
- android程序崩溃后重启
- Android UI(四)云通讯录项目之云端更新进度条实现
- 1、Android Studio集成极光推送(Jpush) 报错 java.lang.UnsatisfiedLinkError: cn.jpush.android.service.PushProtoco
- 《Android源码设计模式》--单例模式
- Android Studio / IDEA 中.android 文件夹移动出默认位置
- android 证书验证流程分析_Android签名机制之---签名验证过程详解
- Android 9.0修改recovery 菜单项字体大小
- android focusableInTouchMode设置为true导致OnClick事件失效,点击两次生效
- 【错误记录】Android Studio 集成 ARoute 编译报错 ( 兼容 support 库和 androidx 库 | add ‘tools:replace=“android:appCo )
- 【Android Gradle 插件】LintOptions 配置 ③ ( LintOptions#error 方法配置 | Lint 问题 ID | 查询 Lint 问题 ID 列表 )
- 【Android 安全】DEX 加密 ( Proguard keep 用法 | Proguard 默认混淆结果 | 保留类及成员混淆结果 | 保留注解以及被注解修饰的类/成员/方法 )
- Android高手进阶——Adapter深入理解与优化
- Android查询 每个进程的权限
- Android Studio 经常使用功能介绍
- Android数据库专家秘籍(七)经验LitePal查询艺术
- 主力机从iphone换到android是一种什么体验?
- Android中Intent传递对象的两种方法:Serializable & Parcelable
- Android适配【入坑指南+解决痛点】
- Android画中画
- Android Studio 理解com.android.support:appcompat-v7:x.x.x依赖包(建议收藏)
- Android 解决之依赖包中添加的com.android.support版本不同导致冲突的问题
- Android 11.0 系统关机动画的功能实现
- Android Studio NDK报错:mips64el-linux-android-strip 找不到