android.database.sqlite.SQLiteException:near“...”:语法错误(代码1)

时间:2013-06-06 13:04:42

标签: android database sqlite

当我打开我的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'

4 个答案:

答案 0 :(得分:10)

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

正确的解决方案是通过使用selectionArgs来逃避SQLite,而不是尝试逃避自我。在你的情况下,那将是:

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

此外,它更干净,因为您可以从查询中获取常量,而不是每次都构建它。

答案 1 :(得分:6)

除非您别无选择,否则请勿使用原始查询!

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);

答案 2 :(得分:1)

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

  

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

更多信息here

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

How do I use prepared statements in SQlite in Android?

答案 3 :(得分:1)

到目前为止给出的答案是正确的,但使用参数化查询会更好。没有额外的工作 - 实际上他们提出的逃避单引号的建议更容易。