You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:54:07