ContentResolver.query的参数问题 按条件实现模糊查询

本文详细解析了ContentResolver的query方法,重点介绍了如何使用第三个参数设置查询条件,以及第四参数null的用法。通过实例演示,帮助开发者更深入地理解并应用这一API。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ContentResolver.query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

 

第三个参数写成你想要的条件,第四个参数设为null.
如:
Cursor cursor=getContentResolver().query(Phones.CONTENT_URI, null, Phones.NUMBER+" LIKE"+" '%"+ text +"%'"+" OR "+Phones.NAME+" LIKE"+" '%"+text+"%'", null, null);

<think>我们正在处理一个关于Android ContentResolverquery方法使用的问题。根据用户的问题,我们需要解释如何使用ContentResolver进行查询。根据引用[1]:在Android11及以上版本,官方推荐使用Bundle方式而不是原始的SQL语句方式。因此,我们将重点介绍Bundle方式。同时,我们也会提到传统的查询方式,因为对于低版本Android,传统方式仍然可用。步骤:1.介绍ContentResolver的基本作用:它是应用间数据共享的桥梁,通过URI来访问ContentProvider提供的数据。2.解释query方法的参数(传统方式):-uri:指定要查询的数据集-projection:返回哪些列(相当于SQL的SELECT后面的列)-selection:条件子句(相当于SQL的WHERE子句)- selectionArgs:条件子句中占位符(?)的具体值- sortOrder:排序方式3.介绍新方式(使用Bundle):-在Android11(API级别30)引入,通过Bundle传递查询参数。- Bundle中可以包含以下键(定义在ContentResolver类中):-QUERY_ARG_SQL_SELECTION:对应selection-QUERY_ARG_SQL_SELECTION_ARGS:对应selectionArgs-QUERY_ARG_SQL_SORT_ORDER:对应sortOrder- QUERY_ARG_SQL_LIMIT:限制返回的行数-等等-使用Bundle方式可以避免SQL注入,并且更安全。4.提供两种方式的代码示例。5.注意事项:在Android11及以上,推荐使用Bundle方式,但传统方式仍然可用。在低版本上,只能使用传统方式。6.生成相关问题。我们将按照上述步骤进行回答。</think>### Android ContentResolver.query() 方法详解 在 Android 开发中,`ContentResolver.query()` 是访问 ContentProvider 数据的核心方法。根据 Android 11 (API 30) 及以上版本的官方推荐[^1],建议使用 Bundle 方式替代传统 SQL 语句参数。以下是两种使用方式: #### ✅ 推荐方式(Bundle 参数) ```java // 构建查询参数 Bundle Bundle queryArgs = new Bundle(); queryArgs.putString(ContentResolver.QUERY_ARG_SQL_SELECTION, "name=? AND age>?"); queryArgs.putStringArray(ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS, new String[]{"John", "18"}); queryArgs.putString(ContentResolver.QUERY_ARG_SQL_SORT_ORDER, "age DESC"); queryArgs.putInt(ContentResolver.QUERY_ARG_LIMIT, 10); // 限制返回数量 // 执行查询 Cursor cursor = contentResolver.query( contentUri, new String[]{"_id", "name", "age"}, // 返回列 queryArgs, // 查询参数 Bundle null // 取消信号 ); ``` #### ⚠️ 传统方式(SQL 参数) ```java Cursor cursor = contentResolver.query( contentUri, new String[]{"_id", "name", "age"}, // projection "name=? AND age>?", // selection new String[]{"John", "18"}, // selectionArgs "age DESC" // sortOrder ); ``` ### 关键参数说明 1. **URI** 指定数据源(如 `ContactsContract.Contacts.CONTENT_URI`) 2. **Projection** 返回的列名数组(`null` 返回所有列) 3. **Bundle 参数键**(Android 11+)[^1]: - `QUERY_ARG_SQL_SELECTION`: WHERE 条件 - `QUERY_ARG_SQL_SELECTION_ARGS`: 条件参数 - `QUERY_ARG_SQL_SORT_ORDER`: 排序规则 - `QUERY_ARG_LIMIT`: 结果数量限制 4. **结果处理** 始终通过 `Cursor` 遍历结果: ```java while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); } cursor.close(); // 必须关闭! ``` ### 注意事项 1. **线程安全** 避免在主线程执行耗时查询(可能触发 ANR)[^5],建议使用 `AsyncTask` 或线程池[^2][^4] 2. **权限声明** 在 `AndroidManifest.xml` 添加对应权限: ```xml <uses-permission android:name="android.permission.READ_CONTACTS" /> ``` 3. **性能优化** 使用 `QUERY_ARG_LIMIT` 限制数据量,避免返回过多无用字段 > 官方文档参考:[ContentProvider.query()](https://developer.android.com/reference/android/content/ContentProvider#query)[^1]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值