我在我的数据库中添加了一个新表:
CREATE TABLE myTable (
myId ID NOT NULL,
aNumber INTEGER NOT NULL,
anUniqueTextId TEXT NOT NULL,
aText TEXT,
PRIMARY KEY(myId, anUniqueTextId) ON CONFLICT IGNORE,
FOREIGN KEY(anUniqueTextId, aNumber) REFERENCES otherTable(otherTableId, otherTableValue2) ON DELETE CASCADE
);
现在我想插入值,而不是手动找出我应该放在myId
字段中的索引:
[myDatabase inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdate:@"INSERT INTO myTable VALUES(?,?,?)",
// @(myData.myId), //I don't want to insert it manually
@(aNumber),
myData.anUniqueTextId,
myData.aText];
if (db.lastErrorCode) {
NSLog(@"Huston, we've got a problem: %@", db.lastError.localizedDescription);
}
}];
Ofc,我在这里说错误:
table myTable has 4 columns but 3 values were supplied
现在的问题是如何插入数据以使该字段自动插入myId?我不确定我的插入代码是无效还是CREATE TABLE语句。
- 更新 -
我已更新create statement以更正一个:
CREATE TABLE myTable (
myId INTEGER PRIMARY KEY DEFAULT 0 NOT NULL,
aNumber INTEGER NOT NULL,
anUniqueTextId TEXT NOT NULL,
aText TEXT,
FOREIGN KEY(anUniqueTextId, aNumber) REFERENCES otherTable(otherTableId, otherTableValue2) ON DELETE CASCADE
);
答案 0 :(得分:1)
关于您的评论,您需要在QUERY中指定PRIMARY KEY
NULL
值:
[db executeUpdate:@"INSERT INTO myTable VALUES(?,?,?,?)",
NULL,
@(aNumber),
myData.anUniqueTextId,
myData.aText];
这样数据库就会填充主键并自动增加它(PRIMARY KEY
的SQL Lite规范)。
答案 1 :(得分:0)
您需要更改表的架构。
要自动插入myId
字段,您必须在创建表时添加约束AUTOINCREMENT
。此字段也必须用作主键。所以现在表的模式如下:
CREATE TABLE myTable (
myId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
aNumber INTEGER NOT NULL,
anUniqueTextId TEXT NOT NULL,
aText TEXT,
FOREIGN KEY(anUniqueTextId, aNumber) REFERENCES otherTable(otherTableId, otherTableValue2) ON DELETE CASCADE
);