SQLite 语法错误,靠近“CREATE TABLE”。

3
这是我的代码:
    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): ,在编译时出现错误:CREATE TABLE PapersTable(_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT, state TEXT);
4个回答

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

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


0
在您的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);


1
去掉AUTOINCREMENT会改变语义,而在SQL语句末尾加上分号虽然是多余的,但也能正常工作。 - CL.
主键属性中不需要AUTOINCREMENT,因为PRIMARY KEY已经具有此属性。 在创建表括号的末尾加上分号不是创建表的正确方式,请删除它。 在onCreate()中也不需要db.close(),因为只有在对数据库表执行某些操作时才需要它,所以您也可以将其删除。 - Vaibhav Agarwal
1
没有AUTOINCREMENT,删除记录的ID可能会被重复使用。(请阅读文档!)分号本身没有任何问题(无论如何,这与问题无关)。 - CL.
是的,我同意,但如果记录再次使用已删除的ID,则没有问题。这将是一个具有旧ID的新条目,因此用户可以轻松访问数据。对于分号,确实没有任何错误,但它是无用的,没有必要加上那个分号,所以可以省略。 - Vaibhav Agarwal

0

我的代码在表格主体后面缺少了闭合的)

CREATE TABLE IF NOT EXIST user_table (
  id integer NOT NULL PRIMARY KEY AUTOINCREMENT,
  title TEXT,
  author TEXT,
  state TEXT
); -- this closing ')' was missing

-1
在SQLite中,声明为integer primary key的列将自动递增,因此请尝试删除它:
String CREATE_DATABASE = "CREATE TABLE " + TABLE_NAME + "("  + 
        KEY_ID + " INTEGER PRIMARY KEY, " + 
        "title TEXT, "+
        "author TEXT, "+
        "state TEXT);";

请参考此答案


1
链接的答案是错误的。SQLite支持AUTOINCREMENT,而INTEGER PRIMARY KEYINTEGER PRIMARY KEY AUTOINCREMENT的语义略有不同。请参阅http://www.sqlite.org/autoinc.html。 - laalto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接