B4A下ContentResolver报错"Invalid token limit"及limit用法咨询
B4A ContentResolver 正确传递limit参数实现方案
问题原因
Android 11(API 30)及以上版本不再支持在ContentResolver的query方法的排序字符串或筛选条件中直接拼接LIMIT、OFFSET参数,否则会抛出Invalid token limit错误,必须通过Bundle参数调用新增的query重载方法:
public Cursor query (Uri uri,String[] projection,Bundle queryArgs,CancellationSignal cancellationSignal)
具体实现
版本兼容逻辑
优先判断设备SDK版本,API >=30时走新的传参逻辑,低于30可沿用原有拼接写法。
代码示例
' 需提前引入相关库:ContentResolver、Phone、Uri、Bundle、Cursor、CancellationSignal Dim cr As ContentResolver Dim targetUri As Uri ' 替换为实际业务的查询Uri Dim projection() As String = Array("_id", "title", "create_time") ' 按需设置查询字段,无要求可传Null Dim resultCursor As Cursor Dim phoneInfo As Phone If phoneInfo.SdkVersion >= 30 Then ' Android 11及以上用Bundle传参 Dim queryArgs As Bundle queryArgs.Initialize ' 分页参数:limit为返回条数,offset为偏移量 queryArgs.PutString("android:limit", "20") queryArgs.PutString("android:offset", "0") ' 筛选条件、筛选参数、排序规则也通过Bundle传入 queryArgs.PutString("android:selection", "status = ?") queryArgs.PutStringArray("android:selectionArgs", Array As String("1")) queryArgs.PutString("android:sortOrder", "create_time DESC") Dim cancelSignal As CancellationSignal ' 无需取消查询功能可直接传Null resultCursor = cr.Query(targetUri, projection, queryArgs, cancelSignal) Else ' 低版本沿用原有写法 resultCursor = cr.Query(targetUri, projection, "status = ?", Array As String("1"), "create_time DESC LIMIT 0,20") End If ' 后续正常处理resultCursor返回的数据即可
注意事项
- Bundle中固定使用
android:limit和android:offset作为分页参数的key,为系统原生约定字段,不可自定义 - 不需要OFFSET参数时可以不传,仅传LIMIT即可实现取前N条数据的效果
内容的提问来源于stack exchange,提问作者S.M.R
相关产品推荐
相关产品推荐

