为了账号安全,请及时绑定邮箱和手机立即绑定

SQLite rawQuery + String.format = “该语句有 0 个参数。”?

SQLite rawQuery + String.format = “该语句有 0 个参数。”?

一只斗牛犬 2023-06-04 16:59:53
我正在尝试在 android 中执行 sqlite rawquery。我从我的设备上下载了数据库,并使用“sqlite 查询浏览器”Windows 程序试错,直到我得到我想要的。现在的问题是我有我需要的字符串,我似乎无法将参数输入其中,我怀疑它只是某种字符串转义缺陷。我要执行的查询是SELECT lis.name from listItemSuggestion lis LEFT JOIN listItem li ON lis.name = li.name WHERE li.name is NULL AND lis.name LIKE '%a%'其中 '%a%' 中的 a 需要是可变参数。我在代码中所做的是这样的:getReadableDatabase().rawQuery(        String.format("SELECT lis.%s from %s lis LEFT JOIN %s li ON lis.%s = li.%s WHERE li.%s is NULL AND lis.%s LIKE '%%?%%';",            ListItemSuggestion.COLUMN_NAME,            ListItemSuggestion.TABLE_NAME,            ListItem.TABLE_NAME,            ListItemSuggestion.COLUMN_NAME,            ListItem.COLUMN_NAME,            ListItem.COLUMN_NAME,            ListItemSuggestion.COLUMN_NAME        ),        new String[]{filter}    );合同类是:import android.provider.BaseColumns;public final class ListItem {private ListItem(){}public static class ListItemEntry implements BaseColumns{    public static final String TABLE_NAME   = "listItem";    public static final String COLUMN_DONE  = "done";    public static final String COLUMN_NAME  = "name";    public static final String COLUMN_COUNT = "count";    public static final String COLUMN_TIMESTAMP = "timestamp";}}import android.provider.BaseColumns;public final class ListItemSuggestion {private ListItemSuggestion(){}public static class ListItemSuggestionEntry implements BaseColumns{    public static final String TABLE_NAME   = "listItemSuggestion";    public static final String COLUMN_NAME  = "name";}}我得到的错误是:无法在索引 1 处绑定参数,因为索引超出范围。该语句有 0 个参数。(这意味着它没有在查询中找到“?”,对吧?虽然有一个......,顺便说一句,“过滤器”是一个方法参数)顺便说一句:该查询的目的是为输入提供建议,其中列表项是动态的(= 在列表/表上,它们可以随时从中删除),而每个项目也会静默创建一个建议项(在另一个表中)实际项目被删除时不会被删除。where 子句应获取与当前文本输入状态匹配的建议,并排除列表中已存在的项目。
查看完整描述

3 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

无法在索引 1 处绑定参数,因为索引超出范围。该语句有 0 个参数。(这意味着它没有在查询中找到“?”,对吗?


不完全是。


虽然有一个......,顺便说一句,“过滤器”是一个方法参数)


问题是问号在带引号的字符串内。这使它成为纯文本,而不是参数占位符。这种变化似乎是你要找的:


getReadableDatabase().rawQuery(

        String.format("SELECT lis.%s from %s lis LEFT JOIN %s li ON lis.%s = li.%s WHERE li.%s is NULL AND lis.%s LIKE ?;",

            ListItemSuggestion.COLUMN_NAME,

            ListItemSuggestion.TABLE_NAME,

            ListItem.TABLE_NAME,

            ListItemSuggestion.COLUMN_NAME,

            ListItem.COLUMN_NAME,

            ListItem.COLUMN_NAME,

            ListItemSuggestion.COLUMN_NAME

        ),

        new String[]{ "%" + filter + "%" }

    );


查看完整回答
反对 回复 2023-06-04
?
MYYA

TA贡献1868条经验 获得超4个赞

完全不相关,但如果使用字符串连接,SQL 将更容易阅读:


getReadableDatabase().rawQuery(

        "SELECT lis." + ListItemSuggestion.COLUMN_NAME +

         " FROM " + ListItemSuggestion.TABLE_NAME + " lis" +

         " LEFT JOIN " + ListItem.TABLE_NAME + " li" +

           " ON li." + ListItem.COLUMN_NAME + " = lis." + ListItemSuggestion.COLUMN_NAME +

        " WHERE li." + ListItem.COLUMN_NAME + " IS NULL" +

          " AND lis." + ListItemSuggestion.COLUMN_NAME + " LIKE ?",

        new String[] { "%" + filter + "%" }

    );

实际上,您只用于li存在性检查,所以这样写:


getReadableDatabase().rawQuery(

        "SELECT " + ListItemSuggestion.COLUMN_NAME +

         " FROM " + ListItemSuggestion.TABLE_NAME +

        " WHERE " + ListItemSuggestion.COLUMN_NAME + " LIKE ?" +

          " AND " + ListItemSuggestion.COLUMN_NAME + " NOT IN (" +

                 " SELECT li." + ListItem.COLUMN_NAME +

                   " FROM " + ListItem.TABLE_NAME + " li )",

        new String[] { "%" + filter + "%" }

    );


查看完整回答
反对 回复 2023-06-04
?
不负相思意

TA贡献1777条经验 获得超10个赞

我不知道你怎么看这个:


'%%?%%'

可以,但是您必须将其更改为串联'%' || ? || '%':


getReadableDatabase().rawQuery(

        String.format("SELECT lis.%s from %s lis LEFT JOIN %s li ON lis.%s = li.%s WHERE li.%s is NULL AND lis.%s LIKE '%' || ? || '%';",

            ListItemSuggestion.COLUMN_NAME,

            ListItemSuggestion.TABLE_NAME,

            ListItem.TABLE_NAME,

            ListItemSuggestion.COLUMN_NAME,

            ListItem.COLUMN_NAME,

            ListItem.COLUMN_NAME,

            ListItemSuggestion.COLUMN_NAME

        ),

        new String[]{filter}

    );


查看完整回答
反对 回复 2023-06-04
  • 3 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信