【问题标题】:sqlite LIKE problem in androidandroid中的sqlite LIKE问题
【发布时间】:2011-03-03 10:36:41
【问题描述】:

您好,我花了将近 2 个小时试图弄清楚为什么 LIKE 语句不起作用,我只收到此错误:03-03 11:31:01.770: ERROR/AndroidRuntime(11767): Caused by: android.database.sqlite.SQLiteException: bind or column index out of range: handle 0x89d9f8

在 SQLiteManager 中,它的工作原理如下:SELECT Word FROM Sign WHERE Word LIKE 'he%'; 但是,当我尝试从 java 中执行此操作时,它将无法正常工作。 这是我的查询,我尝试了很多方法都没有运气:

Cursor cursor = m_db.query(MY_TABLE, new String[] {"rowid","Word"},"Word"+" LIKE '"+" ?"+"%'", new String[]{name}, null, null, null);

有什么想法吗?是我做错了还是有错误?

感谢您的宝贵时间。

【问题讨论】:

    标签: android


    【解决方案1】:

    解决方案其实很简单。只需在您的 selectionArgs 中包含 %。

    String []selectionArgs = {name + "%"});
    

    【讨论】:

    • 这对我有用。该解决方案比 Olsavage 的解决方案更好,因为它不易受到 SQL 注入的影响。
    • @Kowlown,你能告诉我如何在你的 Olsavage 的方法中完成 sql,因为两者看起来和我一模一样
    • @juztcode 已经用正确的方法编辑了答案,以防止 SQL 注入。 2014年的编辑不错,可以用。
    【解决方案2】:

    我认为您不应该将 selArgs 用于 LIKE 这样的方式。你可以试试这个:

    Cursor cursor = m_db.query(MY_TABLE, new String[] {"rowid","Word"},"Word"+" LIKE '"+name+"%'", null, null, null, null);
    

    编辑:

    好的,如果您想避免 SQL 注入,请不要使用上述解决方案,请使用以下解决方案:

    Cursor cursor = m_db.query(MY_TABLE, new String[] {"rowid","Word"},"Word LIKE '?'", new String[]{name+"%"}, null, null, null);
    

    【讨论】:

    • 没错,成功了! LIKE 语句为什么会发生这种情况有什么解释吗?感谢您的回答,祝您有愉快的一天。
    • 我想,你就是不能用?带引号,就像你做的那样 "Word LIKE '?%'"。
    • 那么 SQL 注入呢?乔纳斯的回答似乎更好。
    • 请不要使用这个“解决方案”。它容易受到 SQL 注入的攻击。请参阅xkcd.com/327 了解一个很好的例子。
    • ? 周围不需要单引号。
    【解决方案3】:

    我就是这样做的:

    String []columns = {"_id", "name"};
    String []selectionArgs = {name+"%"};
    db.query(true,"mydb",columns,"name LIKE ?",selectionArgs,null,null,null);
    

    【讨论】:

      【解决方案4】:

      另一个——也许更干净——解决方案是使用|| 运算符,如下所述:Sqlite binding within string literal

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-11
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-01
        • 2015-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多