ContentResolver.query详解

2023-05-16

1.查询手机的联系人
    public void getContacts() {
        ContentResolver contentResolver = this.getContentResolver();
        Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
                null, null, null, null);
        if (cursor != null && cursor.moveToFirst()) {
            do {
                Log.d(TAG,cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID)));
                Log.d(TAG,cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME)));
            } while (cursor.moveToNext());
        }
        cursor.close();
    }

记得开权限

 <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />

log

05-08 16:20:08.639 7447-7447/com.bbk.contentprovidertest D/notecontent: 1
05-08 16:20:08.639 7447-7447/com.bbk.contentprovidertest D/notecontent: 阿大
05-08 16:20:08.639 7447-7447/com.bbk.contentprovidertest D/notecontent: 2
05-08 16:20:08.639 7447-7447/com.bbk.contentprovidertest D/notecontent: 阿牛
05-08 16:20:08.639 7447-7447/com.bbk.contentprovidertest D/notecontent: 3
05-08 16:20:08.639 7447-7447/com.bbk.contentprovidertest D/notecontent: 阿虎
05-08 16:20:08.639 7447-7447/com.bbk.contentprovidertest D/notecontent: 4
05-08 16:20:08.639 7447-7447/com.bbk.contentprovidertest D/notecontent: 海哥
cusor的正确遍历方式

查询得到的cursor是指向第一条记录之前的,因此查询得到cursor后第一次调用moveToFirst或moveToNext都可以将cursor移动到第一条记录上。但是为了规避一些可能存在的情况,下面这种写法比较保险

if (cursor != null && cursor.moveToFirst())
{
      do{

      }while(cursor.moveToNext());
}
cursor.close();

这篇文章主要讲解ContentResolver的query方法。

ContentResolver直译为内容解析器,什么东东?Android中程序间数据的共享是通过Provider/Resolver进行的。提供数据(内容)的就叫Provider,Resovler提供接口对这个内容进行解读。

根据Android文档,

public final Cursor query (Uri uri, String[] projection,String selection,String[] selectionArgs,String sortOrder)

第一个参数,uri

uri是什么呢?好吧,上面我们提到了Android提供内容的叫Provider,那么在Android中怎么区分各个Provider?有提供联系人的,有提供图片的等等。所以就需要有一个唯一的标识来标识这个Provider,Uri就是这个标识,android.provider.ContactsContract.Contacts.CONTENT_URI就是提供联系人的内容提供者,可惜这个内容提供者提供的数据很少。

第二个参数,projection,

这个参数告诉Provider要返回的内容(列Column),比如Contacts Provider提供了联系人的ID和联系人的NAME等内容,如果我们只需要NAME,那么我们就应该使用:

Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,  
    new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME}, null, null, null);  

当然,下面打印的你就只能显示NAME了,因为你返回的结果不包含ID。用null表示返回Provider的所有内容(列Column)。
Log

05-08 16:00:55.587 13524-13524/com.bbk.contentprovidertest D/notecontent: 阿大
05-08 16:00:55.588 13524-13524/com.bbk.contentprovidertest D/notecontent: 阿牛
05-08 16:00:55.588 13524-13524/com.bbk.contentprovidertest D/notecontent: 阿虎
05-08 16:00:55.588 13524-13524/com.bbk.contentprovidertest D/notecontent: 海哥

第三个参数,selection,

设置条件,相当于SQL语句中的where。null表示不进行筛选。如果我们只想返回名称为“海哥”的数据,第三个参数应该设置为:

 Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
                new String[]{ContactsContract.Contacts.DISPLAY_NAME}, ContactsContract.Contacts.DISPLAY_NAME + "= '海哥'", null, null);//注意‘海哥’ 

获取到的结果,Log

05-08 16:05:16.264 20723-20723/com.bbk.contentprovidertest D/notecontent: 海哥

例如查询手机中以.txt结尾的文件

Cursor cursor = getContentResolver().query(
                Uri.parse("content://media/external/file"),
                projection,
                MediaStore.Files.FileColumns.DATA + " like ?" ,
                new String[]{"%.txt"},
                null);

SQL模糊查询语句

先看下面这个函数,查询手机中以.txt结尾的文件以及文档大小要超过500KB的文档。

  private void queryBooks() {
        String[] projection = new String[]{MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.SIZE};
        //查询以.txt结尾的文件以及文件大小超过1024*500(500KB)
        //注意 AND  俩边空格 
        Cursor cursor = getContentResolver().query(
                Uri.parse("content://media/external/file"),
                projection,
                MediaStore.Files.FileColumns.DATA + " like ?" + " AND " + MediaStore.Files.FileColumns.SIZE + " >= ?",
                new String[]{"%.txt", "512000"},
                null);
        if (cursor != null && cursor.moveToFirst()) {
            do {
                int ctitle = cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA);
                int csize = cursor.getColumnIndex(MediaStore.Files.FileColumns.SIZE);
                Recommend.RecommendBooks books = new Recommend.RecommendBooks();
                long size = cursor.getLong(csize);
                String title = cursor.getString(ctitle);
                int dot = title.lastIndexOf("/");
                String name = title.substring(dot + 1);
                if (name.lastIndexOf(".") > 0) {
                    name = name.substring(0, name.lastIndexOf("."));
                }
                books.title = name;
                books.lastChapter = FileUtils.formatFileSizeToString(size);
                books.isFromSD = true;
                mList.add(books);
            } while (cursor.moveToNext());
          
        }
        cursor.close();
        mAdapter.setListItems(mList);
        mAdapter.notifyDataSetChanged();
        mListView.setAdapter(mAdapter);

    }

上面这段代码直接在查询时,就明确了要求,查询效率也大幅度提升,比在查询后根据size再次判断快了200多毫秒。

SQL模糊查询,使用like比较字,加上SQL里的通配符:

like使用:

下面一些实例演示了 带有 ‘%’ 和 ‘_’ 运算符的 LIKE 子句不同的地方:

语句描述
WHERE SALARY LIKE ‘200%’查找以 200 开头的任意值
WHERE SALARY LIKE ‘%200%’查找任意位置包含 200 的任意值
WHERE SALARY LIKE ‘_00%’查找第二位和第三位为 00 的任意值
WHERE SALARY LIKE ‘2_%_%’查找以 2 开头,且长度至少为3个字符的任意值
WHERE SALARY LIKE ‘%2’查找以 2 结尾的任意值
WHERE SALARY LIKE ‘_2%3’查找第二位为 2,且以 3 结尾的任意值
WHERE SALARY LIKE ‘2___3’查找长度为 5位数,且以2开头以3结尾的任意值

第四个参数,selectionArgs,

这个参数是要配合第三个参数使用的,如果你在第三个参数里面有?,那么你在selectionArgs写的数据就会替换掉?,

  Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
                new String[]{ContactsContract.Contacts.DISPLAY_NAME}, ContactsContract.Contacts.DISPLAY_NAME + "= ?", new String[]{"海哥"}, null);

效果和上面一句的效果一样。

第五个参数,sortOrder,

按照什么进行排序,相当于SQL语句中的Order by。如果想要结果按照ID的降序排列:

Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,  
                null, null,null, android.provider.ContactsContract.Contacts._ID + " DESC");

Log

05-08 16:18:11.061 4921-4921/com.bbk.contentprovidertest D/notecontent: 海哥
05-08 16:18:11.061 4921-4921/com.bbk.contentprovidertest D/notecontent: 阿虎
05-08 16:18:11.061 4921-4921/com.bbk.contentprovidertest D/notecontent: 阿牛
05-08 16:18:11.061 4921-4921/com.bbk.contentprovidertest D/notecontent: 阿大

升序,默认排序是升序,也可+" ASC":


Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,  
                null, null,null, android.provider.ContactsContract.Contacts._ID + " ASC"); 

Log

05-08 16:18:53.787 6316-6316/com.bbk.contentprovidertest D/notecontent: 阿大
05-08 16:18:53.787 6316-6316/com.bbk.contentprovidertest D/notecontent: 阿牛
05-08 16:18:53.787 6316-6316/com.bbk.contentprovidertest D/notecontent: 阿虎
05-08 16:18:53.787 6316-6316/com.bbk.contentprovidertest D/notecontent: 海哥

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ContentResolver.query详解 的相关文章

  • linux下调用mysql_query产生SIGSEGV段错误

    xfeff xfeff 程序需要用到MySQL来进行持久化 xff0c 代码在windows测试通过 xff0c 但在Linux调试时 xff0c 产生下面的异常 xff1a Thread 9 34 NodesManagerd 34 rec
  • mysql中对比 JSON_VALUE 与 JSON_QUERY

    1 JSON概述 MySQL里的json分为json array和json object 表示整个json对象 xff0c 在索引数据时用下标 对于json array xff0c 从0开始 或键值 对于json object xff0c
  • http请求参数之Query String Parameters、Form Data、Request Payload

    在与server端进行数据传递时 xff0c 通常会用到GET POST方法进行参数提交 xff0c 而参数提交的方式 xff0c 通常取决于server端对数据的接收方式 本文对几种常见的参数提交方式进行归纳及简述 xff0c 这不是一篇
  • Apache IoTDB Query is time out (-1ms)

    现象 查询超时 xff0c 服务器出现一下日志 2022 01 05 15 57 05 724 pool 12 IoTDB query time manager 1 WARN o a i d q c QueryTimeManager 71
  • ContentResolver.query详解

    1 查询手机的联系人 public void getContacts ContentResolver contentResolver 61 this getContentResolver Cursor cursor 61 contentRe
  • 关于mysql的错误 - no query specified

    Mysql error no query specified mysql下抛出错误 xff1a error no query specified 出现此错误是sql不合法原因 xff1a 如 xff1a select from abc G
  • Scheduling and emailing PeopleSoft Query results

    You could E Mail the Query results by embedding the paramters in a nVision Layout Create a Tabular nVision Layout Add th
  • How To get the usbdisk's drive letter properly

    Introduction We know USB disk should be a removable disk just like floppy disk and be used more and more widely now Beca
  • ES查询效率-Query、Filter&term

    目的 Google上博客众说纷纭大同小异 逻辑正确但略为混乱 再此梳理出容易混淆的点 1 是否算分只与查询方式有关 与是否term查询 match查询无关 Query查询 查询上下文 查询操作不仅仅会进行查询 还会计算分值 用于确定相关度
  • elk笔记13--Queries-term-level queries

    elk笔记13 Queries term level queries 1 term level 查询简介 2 term level 查询类型 2 1 exists query 2 2 fuzzy query 2 3 ids query 2
  • vue-router路由中对query中的参数进行加密

    vue router路由中对query中的参数进行加密 源码地址在文末 在创建路由的时候 添加两个方法 stringifyQuery 序列化传入的query参数 方法可以接收一个对象参数 在new Router的时候传递这个属性 在序列化q
  • c++ primer 中的文本查询示例

    前言 有个牛人叫bnu chenshuo 发微博说 回复 TheRealBo 学生编程练习 把 Unix 的命令行小工具用C C 实现一遍 wc cat ls cp grep sort uniq nc head tail hexdump 把
  • Hql

    1 查询整个映射对象所有字段 直接from查询出来的是一个映射对象 即 查询整个映射对象所有字段 String hql from Users Query query session createQuery hql List
  • 调试笔记之雨过天晴多点还原软件MBR实例

    BY SUDAMI 为了能够调试多点还原软件 雨过天晴 的启动代码 目前有2种方式 引用 1 在Bochs调试器上装Windows XP系统 然后用Bochs单步调试 不过光安装操作系统就得花20个小时以上 2 用Wnhex克隆整个磁盘 配
  • qt学习笔记(八)之深入QSqlQuery

    在上一节中 我们直接调用QSqlQuery exec 对数据库进行增删改查等简单操作 在项目开发中 为了实现系统的低耦合 我们就必须封装出一个数据库功能模块 一 prepare 首先创建一个头文件 attend db h 初始化数据库操作
  • MySQL日志设置及查看

    MySQL有以下几种日志 错误日志 log err 查询日志 log 慢查询日志 log slow queries 更新日志 log update 二进制日志 log bin 默认情况下 所有日志创建于mysqld数据目录中 通过刷新日志
  • 有discuz数据库,忘了管理员密码,怎样进后台

    很简单 你注册一个用户 密码设个简单一点的 然后在ucenter的数据库中uc members表中找到这个用户的password字段和salt字段 把你在uc members表中的管理员账号的password和salt字段修改成新注册用的的
  • 内容提供者ContentProvider和内容解析者ContentResolver

    简介 ContentProvider 在android中的作用是对外共享数据 也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问 其他应用可以通过ContentProvider 对你应用中的数据进行添删改查 关
  • CSS中设置表格TD宽度的问题

    CSS布局 表格宽度不听使唤的实例 想把表格第一例宽度设为20 其他自适应 但CSS中宽度是等宽的 只设这一行也不起作用 但是在实际应用中总是等宽处理 并不按照样式来走 XML HTML代码
  • OceanBase使用范例

    http www mysqlops com 2011 08 31 oceanbase use html OceanBase的使用类似于关系型数据库 需要预先创建schema 关于schema的格式 请参见schema说明 假如我们有以下sc

随机推荐

  • 面试的一般流程及其常见的问题

    又是一年毕业季 xff0c 也要踏上求职之路 xff0c 在这段时间也关注很多求职方面的消息 下面是一些面试的一般流程及其常见的问题 xff1a 面试职位 xff1a XXXX 开始语 xff1a 你好 xff0c 首先祝贺你通过了前几个环
  • 构建库函数(STM32)

    一 定义外设的各基地址 xff0c 参考存储器映射 span class token comment 由存储器的映射可知 xff0c 片上外设基地址0x4000 0000 span span class token macro proper
  • PID控制器原理概述

    PID控制 PID概述 xff1a 控制框图 xff1a 增量式PID和位置式PID特点 xff1a PID控制参数整定口诀 xff1a 注 xff1a 本文部分内容摘自 先进PID控制MATLAB仿真 xff08 第4版 xff09 刘金
  • PyQt5 事件处理机制

    PyQt5 事件处理机制 PyQt为事件处理提供了两种机制 xff1a 高级的信号与槽机制 xff0c 以及低级的事件处理机制 信号与槽可以说是对事件处理机制的高级封装 常见事件类型 xff1a 键盘事件 xff1a 按键按下和松开 鼠标事
  • PyQt5 实现串口接数据波形显示工具

    PyQt5 实现串口接数据波形显示工具 工具简述主程序代码Qt Designer设计UI界面程序运行效果 工具简述 基于PyQt5开发UI界面使用QtDesigner设计 xff0c 需要使用到serial模块 xff08 串口库 xff0
  • ROS CMakeLists.txt的编写学习

    调用ROS中的函数 xff0c cmakelists的编写学习过程 如有错误 xff0c 请留言指教 多谢 A 首先要了解的 CMakeLists txt是CMake的构建系统构建软件包的输入文件 任何兼容的CMake都包含了描述如何构建代
  • 【Node】Buffer 与 Stream

    node 为什么会出现 Buffer 这个模块 在最初的时候 xff0c JavaScript 只运行在浏览器端 xff0c 对于处理 Unicode 编码的字符串很容易 xff0c 但是对于处理二进制以及非 Unicode 编码的数据便无
  • ROS的tf包中坐标变换的方法

    1 setRotation函数的参数 在坐标变换的时候常有这样的写法 xff1a tfTutorialsAdding a frame C 43 43 transform setOrigin span class hljs symbol tf
  • 卡尔曼滤波的理解以及参数调整

    一 前言 卡尔曼滤波器是一种最优线性状态估计方法 xff08 等价于 在最小均方误差准则下的最佳线性滤波器 xff09 xff0c 所谓状态估计就是通过数学方法寻求与观测数据最佳拟合的状态向量 在移动机器人导航方面 xff0c 卡尔曼滤波是
  • ROS自定义msg类型及使用

    一 创建msg消息 参考 xff1a CreatingMsgAndSrv 首先创建一个空的package单独存放msg类型 xff08 当然也可以在任意的package中自定义msg类型 xff09 这里为便于说明 xff0c 建立一个名为
  • WebRTC-集成qsv硬解码实现

    1 Window下QSV硬解码配置 在libavcodec codec list c下添加 amp ff h264 qsv decoder 在ffmpeg generate gni下加入 34 libavcodec h264idct c 3
  • [ROS] ROS基础,创建工作空间,创建功能包,ros功能包相关命令,Catkin编译系统,catkin_make的编译方式

    1 工作空间 工作空间 xff08 work space xff09 是ROS系统中存放工程开发相关的文件夹 xff0c 其目录结构如下 xff1a src xff1a 代码空间 xff08 Source Space xff09 xff0c
  • ijkplayer-添加播放截图功能

    应用播放的时候需要截图 xff0c 可以在上层使用TexturView来使用截图 xff0c 不过太具有局限性呢 xff0c 还是在底层处理比较好 那么先分析下可以在哪里加截图呢 xff1f 看到网上很多做的都不能支持硬解截图 xff0c
  • avformat_seek_file及其flag含义

    我们从ijk中seek的处理流程来看ffmpeg的这个问题 int ffp seek to l FFPlayer ffp long msec assert ffp VideoState is 61 ffp gt is int64 t sta
  • 单例模式

    单例模式 xff1a include lt iostream gt using namespace std class Singleton public Singleton cout lt lt 34 Singleton虚构函数 34 lt
  • ffmpeg系列-解决ffmpeg获取aac音频文件duration不准

    这个问题是这样产生的 xff0c 一同事反应会随机出现ijk获取到的aac文件的duration不准 xff0c 发来一看 xff0c 确实不准 xff0c 在AE或者系统mediaplayer中得到的都是8 4秒 xff08 准确时间是M
  • 基于librtmp的推流实现

    1 推流 配置好rtmpdump库后 xff0c 我们可以先用命令行来推流看下效果 2 流程图 使用librtmp发布RTMP流的可以使用两种API xff1a RTMP SendPacket 和RTMP Write 使用RTMP Send
  • ijkplayer-音视频变速播放实现

    本文主要分析变速播放框架实现细节 xff0c 不分析sonic以及soundtouch变速算法 在我的sonic变速变调原理一文中会详细讲解基于基音周期来实现变速变调的原理 1 变速入口分析 从jni层的 setPropertyFloat函
  • Android_WakeLock使用

    1 前言与WakeLock简介 1 1 前言 一些手机app xff08 如微信 QQ等 xff09 有新消息来到达 xff0c 手机屏幕即使在锁屏状态下也会亮起 xff0c 并提示用户有新消息 但是 xff0c 一般情况下手机锁屏后 xf
  • ContentResolver.query详解

    1 查询手机的联系人 public void getContacts ContentResolver contentResolver 61 this getContentResolver Cursor cursor 61 contentRe