【问题标题】:android.database.sqlite.SQLiteException: near "...": syntax error (code 1)android.database.sqlite.SQLiteException:靠近“...”:语法错误(代码 1)
【发布时间】:2013-06-06 13:04:42
【问题描述】:

当我打开我的 RSS 应用程序时,我想检查我的数据库中是否存在文章。如果存在,我想删除它(或忽略它),如果不将它写入数据库。

我一直在尝试这样做:

            Cursor cursor = ourDatabase.rawQuery("select 1 from "
                    + DBHelper.DATABASE_TABLE + " where " + DBHelper.TITLE + "='"
                    + title + "'" + " AND " + DBHelper.DATE + "='" + date + "'",
                    new String[] {});
            if (cursor.moveToFirst()) {
                boolean exists = (cursor.getCount() > 0);
                cursor.close();
                return exists;
            } else {
    return false;       }

        }

但我收到此错误:

06-06 16:01:11.341: E/AndroidRuntime(13867): Caused by: android.database.sqlite.SQLiteException: near "όσο": syntax error (code 1): , while compiling: select 1 from all_t where title='Ο ΦΟΒΟΣ και ο ΤΡΟΜΟΣ των διαδηλωτών!!! Αυτές οι γυναίκες είναι πιο σκληρές απ' όσο δείχνουν!' AND date='Wed, 05 Jun 2013 18:12:15'

【问题讨论】:

    标签: android database sqlite


    【解决方案1】:

    这是不使用selectionArgs 的典型问题,这正是人们应该使用它们的原因:你用简单的引号引用你的字符串,但你的字符串包含单引号,所以 SQLite 检测到字符串的结尾在它真正结束之前,并尝试将其余部分解析为 SQLite 关键字。

    正确的解决方案是将转义留给 SQLite,通过使用那些 selectionArgs 而不是试图逃避你自己。在你的情况下,那将是:

    Cursor cursor = ourDatabase.rawQuery("select 1 from "
                + DBHelper.DATABASE_TABLE + " where " + DBHelper.TITLE + "=?"
                + " AND " + DBHelper.DATE + "=?",
                new String[] {title, date});
    

    另外,它更简洁,因为您可以在查询中创建一个常量,而不是每次都构建它。

    【讨论】:

    • 不过,@WarrenFaith 是对的,您应该尽可能使用查询。
    【解决方案2】:

    除非别无选择,否则不要使用原始查询!

    Cursor findEntry = db.query(TABLE, columns, DBHelper.TITLE + "=?", new String[] { title }, null, null, null);
    

    或多个东西

    Cursor findEntry = db.query((TABLE, columns, DBHelper.TITLE + "=? and " + DBHelper.DATE + "=?", new String[] { title, date}, null, null, null);
    

    【讨论】:

    • 如果我在没有返回错误的标题的情况下进行检查,并且只有日期,代码有效..
    • 我只会使用select _id 而不是检查cursor.getCount() > 0。 @menu_on_top 你可以不用if moveToFirst() 它应该是if (cursor != null)...
    【解决方案3】:

    到目前为止给出的答案是正确的,但是使用参数化查询会更好。不涉及额外的工作 - 事实上,他们建议转义单引号更容易。

    【讨论】:

      【解决方案4】:

      您必须转义 ' 字符,否则它会破坏您的 SQL。

      “όσο”附近:语法错误(代码 1):,编译时:从 all_t 中选择 1,其中 title='Ο ΦΟΒΟΣ και ο ΤΡΟΜΟΣ των διαδηλωτών!!! Αυτές οι γυναίκες είναι πιο σκληρές απ' όσο δείχνουν!'

      更多信息here

      也许您可以考虑使用preparedStatement,而不是直接操作rawQuery 中的字符串?

      How do I use prepared statements in SQlite in Android?

      【讨论】:

        猜你喜欢
        • 2020-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 2020-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多