今天做到一个小项目,查询手机中短信的信息,当让得去系统暴露出来的数据库中去查询了,后来发现有三种方式可以选择,下面一一写出来。
第一种方式,采用 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();
第二种查询方式,这种查询同样是在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));
}
第三种查询方式,这种方式是利用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利用ContentResolver访问者获取手机短信信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
4. **执行查询**:使用ContentResolver的`query()`方法执行查询,传入构造好的Uri、选择的列、查询条件、排序方式以及游标回调接口。查询结果会返回一个Cursor对象,包含所有匹配的记录。 5. **处理查询结果**:...
然后,调用ContentResolver的query方法,传入Uri、需要查询的列、筛选条件和排序方式。 ```java Uri uri = Uri.parse("content://com.example.myprovider/mydata"); String[] projection = {"column1", "column2"};...
Content Provider是Android系统中用于共享数据的一种机制,每个Content Provider都有一个独一无二的URI(统一资源标识符),通过这个URI,`ContentResolver` 可以查询、插入、更新和删除数据。 二、获取联系人数据 ...
在Android应用开发中,数据库是数据存储的重要方式,特别是在处理大量数据时,为了提高用户体验,分页查询就显得尤为重要。本篇文章将详细讲解如何在Android中实现数据库的分页查询功能,以高效、流畅地加载和展示...
通过这个实验,我们深入理解了ContentResolver在实际应用中的作用,掌握了如何利用ContentResolver查询和操作系统联系人数据的方法。此外,我们还学习了如何创建和使用上下文菜单,以及如何处理ListView的点击事件。...
本文提出了一种基于Android平台的高效短信查询软件设计方案,通过引入多种查询方式解决了当前智能手机短信查询中存在的问题。该方案不仅提高了查询效率,还提升了用户体验。未来还可以考虑加入更多个性化设置选项,...
下面将详细讲解这五种Android数据存储方式。 1. 文件存储: 文件存储是最基础的存储方式,适用于保存大量的文本、图片、音频等原始数据。Android提供`openFileOutput`和`openFileInput`方法,它们位于`Context`类...
MediaPlayer是Android提供的一种简单易用的音频播放解决方案,它可以播放本地和网络上的音频文件。AudioTrack则允许更底层的音频数据操作,适合需要更多控制的高级音频处理。 3. **文件系统访问**: 音乐播放器...
android 把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接调用利用 ContentResolver 去掉用那些封装好的接口就可以进行数据库的操作了。 要使用 MediaStore,首先需要得到一个 ...
3. **框架接口**:Android 29的SDK包含了所有必要的框架接口,让开发者可以访问系统服务,如ActivityManager、ContentResolver等,以实现各种功能。 4. **权限管理系统**:Android Q进一步强化了权限管理,例如,...
综上所述,Android联系人查询涉及到Content Provider、ContentResolver、Cursor等核心概念,而效率优化则是通过合理构建查询、控制数据量、利用异步处理和缓存策略来实现。理解并掌握这些知识点,能帮助开发者高效、...
1. **ContentResolver 概念**:`ContentResolver` 是 Android 系统提供的一个接口,它允许应用通过统一的方式与各种数据源(如 SQLite 数据库、文件系统、网络资源等)进行通信,无需关心底层实现细节。 2. **...
在Android平台上,开发人员可以利用系统的API来读取用户的联系人数据。这通常涉及到权限管理、ContentResolver的使用以及Cursor的遍历等关键知识点。以下是对这个"android读取系统联系人"主题的详细讲解: 1. **...
本篇将详细介绍如何在Android中利用ContentProvider和ContentResolver来操作联系人。 一、ContentProvider基础 1. **ContentProvider的作用**:ContentProvider为应用程序提供了一种标准化的方式,使得应用的数据...
"Android Contacts之三自定义的联系人列表特效 A" 主题着重于如何利用Android SDK和相关技术来实现一种独特的联系人展示方式。我们将深入探讨如何自定义联系人列表,使其不仅功能强大,而且视觉上引人注目。 首先,...