【问题标题】:SQLite syntax error near "CREATE TABLE"“CREATE TABLE”附近的 SQLite 语法错误
【发布时间】:2013-12-30 04:55:37
【问题描述】:

这是我的代码:

    String CREATE_DATABASE = "CREATE TABLE " + TABLE_NAME + "("  + 
            KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
            "title TEXT, "+
            "author TEXT, "+
            "state TEXT);";

    db.execSQL(CREATE_DATABASE);

LogCat 说:12-11 23:43:50.553: E/AndroidRuntime(3706): android.database.sqlite.SQLiteException: near "CREATE TABLE": syntax error (code 1): , while compile: CREATE TABLE PapersTable(_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT, state TEXT);

【问题讨论】:

    标签: android sqlite syntax-error


    【解决方案1】:

    在 SQLite 中,声明整数主键的列将自动递增,因此请尝试删除它:

    String CREATE_DATABASE = "CREATE TABLE " + TABLE_NAME + "("  + 
            KEY_ID + " INTEGER PRIMARY KEY, " + 
            "title TEXT, "+
            "author TEXT, "+
            "state TEXT);";
    

    请参阅此answer 以供参考。

    【讨论】:

    • 链接的答案是错误的。 SQLite 支持AUTOINCREMENTINTEGER PRIMARY KEYINTEGER PRIMARY KEY AUTOINCREMENT 的语义略有不同。见sqlite.org/autoinc.html
    【解决方案2】:

    在您的 onCreate 方法中尝试此代码。

    1. 删除 KEY_ID 的 AUTOINCREMENT,因为它已被声明为主键。
    2. 删除“;”您放置在字符串中的最后一个括号之后,即字符串 CREATE_DATABASE 中的倒数第二个分号。
    3. 从 oncreate() 中删除 db.close()

    要替换的代码: String CREATE_DATABASE = "CREATE TABLE "+TABLE_NAME+ " ( "+KEY_ID+" INTEGER PRIMARY KEY, "+KEY_TITLE+"TEXT, "+KEY_AUTHOR+"TEXT, "+KEY_STATE+"TEXT )"; db.execSQL(CREATE_DATABASE);

    【讨论】:

    • 删除 AUTOINCREMENT 会改变语义,SQL 语句末尾的分号虽然是多余的,但效果很好。
    • 主键属性不需要AUTOINCREMENT,因为这个属性已经被主键获取了。创建表格括号末尾的分号不是创建表格的正确方法,因此请删除它。 onCreate() 中也不需要 db.close(),因为当我们对数据库表执行某些操作时需要它,因此您也可以将其删除。
    • 如果没有 AUTOINCREMENT,删除记录的 ID 可能会被重用。 (阅读documentation!)分号并没有错(无论如何这与问题中的问题无关)。
    • 是的,我同意,但如果一条记录再次使用已删除的 id,则没有问题。这将是一个带有旧 id 的新条目,因此用户可以轻松访问数据。是的,分号没有什么不正确的,但它没用,不需要那个分号,所以可以省略它。
    【解决方案3】:

    CREATE TABLE 语法没有问题,正如您发布的那样。

    我怀疑CREATETABLE 之间有一个不间断空格(ASCII 0xA0)。将其替换为常规空格 (ASCII 0x20)。这可以解释您发布的语法错误:解析器将 CREATE TABLE 视为单个未知标记,而不是作为两个单独的已知标记 CREATETABLE

    绝对错误的是您在作为参数传入函数的SQLiteDatabase db 上调用db.close()。您应该只关闭您自己打开的数据库,并且以这种方式关闭它会导致异常,尽管是不同的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 2013-08-12
      • 2016-03-12
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      相关资源
      最近更新 更多