【发布时间】:2012-05-06 00:05:06
【问题描述】:
我关于stackoverflow的第一个问题,我真的希望你们能帮助我。
我一直在尝试让准备好的语句在目标 C 中运行,到目前为止效果很好。 但是现在我在尝试添加曲目时不断在我的数据库中收到“约束失败”。
我已经删除了数据库并重新创建了它,但错误仍然存在。 此外,我一直在研究重复键,但我没有看到我在任何地方添加重复键。 位置表添加得很好,并且构建方式相同。
我的数据库:
CREATE TABLE locations
(LocationID INTEGER PRIMARY KEY AUTOINCREMENT,
TimestampGPS DATE NOT NULL,
Longitude REAL NOT NULL,
Latitude REAL NOT NULL,
Altitude REAL NOT NULL,
Accuracy REAL NOT NULL,
Bearing REAL NOT NULL,
Speed REAL NOT NULL,
TimestampDevice DATE NOT NULL);
CREATE TABLE tracks
(TrackID INTEGER PRIMARY KEY AUTOINCREMENT,
Title VARCHAR,
Description VARCHAR,
StartTrackDeviceTime DATE NOT NULL,
EndTrackDeviceTime DATE NOT NULL);
CREATE TABLE track_locations
(TrackID INTEGER NOT NULL REFERENCES tracks(TrackID),
LocationID INTEGER NOT NULL REFERENCES locations(LocationID),
PRIMARY KEY (TrackID, LocationID));
我添加曲目的代码。 (我有代码可以添加一个类似的位置,并且工作得很好)
const char *sqlTrack = "INSERT INTO tracks(Title, Description, StartTrackDeviceTime, EndTrackDeviceTime) VALUES(?, ?, ?, ?)";
if(sqlite3_prepare_v2(db.dataBase, sqlTrack, -1, &addTrackStatement, NULL) != SQLITE_OK) {
NSLog(@"Error: %s", sqlite3_errmsg(db.dataBase));
}
sqlite3_bind_text(addTrackStatement, 1, [track.title UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addTrackStatement, 2, [track.description UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addLocationStatement, 3, [[dateFormatter stringFromDate:track.startTime] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addTrackStatement, 4, [[dateFormatter stringFromDate:track.endTime] UTF8String], -1, SQLITE_TRANSIENT);
NSLog(@"Going to execute the statement");
if(SQLITE_DONE != sqlite3_step(addTrackStatement)) {
NSLog(@"First step failed");
NSLog(@"Error: %s", sqlite3_errmsg(db.dataBase));
return NO;
}
else {
long insertedTrack = sqlite3_last_insert_rowid(db.dataBase);
NSLog(@"Inserted id on TRACK: %ld", insertedTrack);
//HERE I ALSO ADD LOCATIONS
sqlite3_clear_bindings(addTrackStatement);
sqlite3_reset(addTrackStatement);
}
【问题讨论】:
-
track.title 和 description 字段中包含什么,以及您拥有的 NSDateFormatter 行吐出什么?在调用四个 sqlite3_bind_text 函数之前,我会准确记录传递给它们的内容并将其发布在此处。也许某些事情不是您所期望的(例如“”或
而不是 nil)或您有非空约束的空白日期。 -
我在所有内容上都使用了 NSLog,所有值都填写得很好 标题:MyTitle 描述:MyDescr 开始日期:2012-04-19 10:26:52GMT+02:00 结束日期:2012-04 -19 10:26:52GMT+02:00 NSDateFormatter 构建如下: dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss zzz"]; Dateformatter 也可以在它工作得很好的地方使用
-
酷。唔。另一个用户在这里有类似的问题:stackoverflow.com/questions/9426843/…。提供的解决方案是使用另一种插入语法。现在我不推荐它,因为我不喜欢它,但这会让问题消失吗?
-
这确实让问题消失了。但如果是这样,绑定有什么问题?
-
是的,这也是我很困惑的;以及为什么我没有将其作为问题的答案。在我的书中,完全避免这个问题并不是真正的答案。 :D
标签: objective-c sqlite prepared-statement