带语句绑定的SQlite AUTOINCREMENT

时间:2015-04-03 08:11:11

标签: android sql sqlite data-binding

创建了一个表

  

“CREATE TABLE student(id INTEGER PRIMARY KEY AUTOINCREMENT,name   TEXT,课程TEXT)“

现在尝试插入像

这样的行
String sql = "INSERT INTO student" +" VALUES (?,?)";
SQLiteStatement statement = myWriteableDatabase.compileStatement(sql);
statement.clearBindings();
statement.bindString(2, "Some Name");
statement.bindString(3, "Some Course");
statement.execute();

这引发了一个例外

table student has 3 columns but 2 values were supplied: , while compiling: INSERT INTO student VALUES (?,?);

为什么这个例外,即使我已将 id 列设为AUTOINCREMENT。

2 个答案:

答案 0 :(得分:3)

如果PRIMARY KEY插入到列中,则NULL自动生成只会启动。

指定要插入的列:

INSERT INTO student(name,course) VALUES ...

以便id列获取NULL默认值,或显式插入NULL值,例如

INSERT INTO student VALUES(NULL,?,?)

同时检查绑定索引。它们不正确 - 它是查询字符串中?的索引,而不是表中列的索引。

答案 1 :(得分:1)

首先,您的bindString次来电显示错误,您的查询中只有2个?个符号,第一个指向名称列,第二个?指向课程栏目。

如果你想使用这样的查询:

INSERT INTO student VALUES ('name', 'course')

您需要将代码更改为(请参阅查询):

String sql = "INSERT INTO student" +" VALUES (NULL, ?,?)";
SQLiteStatement statement = myWriteableDatabase.compileStatement(sql);
statement.clearBindings();
statement.bindString(1, "Some Name");
statement.bindString(2, "Some Course");
statement.execute();

或者您可以使用此查询:

INSERT INTO student (name, course) VALUES ('first', 'second')

在这种情况下,您可以使用以下代码:

String sql = "INSERT INTO student (name, course)" +" VALUES (?,?)";
SQLiteStatement statement = myWriteableDatabase.compileStatement(sql);
statement.clearBindings();
statement.bindString(1, "Some Name");
statement.bindString(2, "Some Course");
statement.execute();