【问题标题】:syntax error while compiling sqlite编译sqlite时出现语法错误
【发布时间】:2013-08-23 14:38:05
【问题描述】:

我正在尝试使用 sqlite 为我的数据库创建一个新表:

String CREATE_ARCHIVE_TABLE = 
"CREATE TABLE {0} ({1} INTEGER PRIMARY KEY AUTOINCREMENT," +
" {2} TEXT NOT NULL, {3} TEXT NOT NULL, {4} TEXT NOT NULL, {5} INTEGER);";

db.execSQL(MessageFormat.format(CREATE_ARCHIVE_TABLE,AItext.TABLE_NAME,AItext._ID,
        AItext.TITLE,AItext.MESSAGE,AItext.DATE,AItext.TYPE));

与接口:

public interface AItext extends BaseColumns {
  String TABLE_NAME = "table_name";
  String TITLE = "title";
  String MESSAGE = "message";
  String DATE = "date";
  String TYPE = "type";
  String[] COLUMNS = new String[]
  { _ID, TITLE, MESSAGE, DATE, TYPE };
}

但我有以下异常,我看不到错误

android.database.sqlite.SQLiteException: near "INTEGER": syntax error: , 
while compiling: CREATE TABLE archive_contacts_name (_id INTEGER PRIMARY KEY
AUTOINCREMENT, message INTEGER, name TEXT NOT NULL, phone TEXT NOT NULL,
check INTEGER, note TEXT NOT NULL);

【问题讨论】:

  • 您的表定义中有message INTEGER,但我很确定您也希望它是TEXT
  • check 是保留关键字。我相信它不能用作列名。

标签: android sqlite compiler-errors


【解决方案1】:

正如@aim 所说,CHECK 实际上是一个不能用作列名的 SQLite 关键字。

CHECK 约束可以附加到列定义或指定为表约束。在实践中它没有区别。每次向表中插入新行或更新现有行时,都会评估与每个 CHECK 约束关联的表达式,并以与 CAST 表达式相同的方式将其转换为 NUMERIC 值。如果结果为零(整数值 0 或实数值 0.0),则发生了约束冲突。如果 CHECK 表达式的计算结果为 NULL 或任何其他非零值,则它不是约束违规。 CHECK 约束的表达式可能不包含子查询。

自 3.3.0 版起已支持 CHECK 约束。在 3.3.0 版本之前,CHECK 约束已被解析但未强制执行。

【讨论】:

    猜你喜欢
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    相关资源
    最近更新 更多