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

Android Studio中rawQuery的LIKE占位符未替换问题求助

问题分析与解决办法

日志显示?未替换的原因

你用String.format(sqlQuery, ...)生成日志,但sqlQuery里的占位符是?,而String.format只识别%s这类格式标记,所以这个格式化操作根本没替换掉?,日志自然还是显示带?的语句。但实际执行的rawQuery方法会正确替换?,这个日志只是你错误的格式化操作导致的误解,不是数据库实际执行的SQL语句。

查询无结果的修复方案

核心问题:COLLATE NOCASE的位置错误

SQLite中,COLLATE NOCASE的语法位置不对会导致大小写不敏感匹配失效,当前写法name LIKE ? COLLATE NOCASE不符合规范,需要调整到列名后。同时修正日志输出方式,避免混淆:

修改后的代码:

String sqlQuery = "WITH Ranked AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY " +
                COLUMN_NAME + " ORDER BY " + COLUMN_NAME + " ASC, " + COLUMN_SYMBOL + " ASC, " +
                COLUMN_DTLASTUPD + " DESC) AS rn FROM " + TABLE_RECORDS + ") " +
                "SELECT * FROM Ranked WHERE rn <= 5 AND " + COLUMN_NAME + " COLLATE NOCASE LIKE ?";
String[] selectionArgs = new String[]{"%" + "inj" + "%"};

// 正确打印日志:直接输出SQL和参数,不用错误的String.format
Log.d("Query Debug", "SQL Query: " + sqlQuery);
Log.d("Query Debug", "Selection Args: " + Arrays.toString(selectionArgs));

cursor = db.rawQuery(sqlQuery, selectionArgs);

额外注意点

  • rawQuery会自动处理参数的转义,不需要用DatabaseUtils.sqlEscapeString,你之前的String.format加转义是多余的,还可能引发参数错误。
  • 如果还是无结果,检查这两点:
    • 数据库表中是否存在name字段包含inj(不区分大小写)的记录
    • 确认COLUMN_NAME、TABLE_RECORDS等常量是否和数据库实际列名、表名完全一致

内容的提问来源于stack exchange,提问作者João Marques

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 18:15:08