带有语句绑定的 SQlite AUTOINCREMENT

SQlite AUTOINCREMENT with Statement Binding

创建了 table

"CREATE TABLE student ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, course 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,为什么还会出现此异常。

PRIMARY KEY 自动生成仅在 NULL 插入到列中时才会启动。

指定要插入的列:

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

以便id列获得NULL默认值,或者显式插入一个NULL值,例如

INSERT INTO student VALUES(NULL,?,?)

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

中列的索引

首先,您的 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();