Objective c SQLITE3约束失败

Objective c SQLITE3约束失败,objective-c,sqlite,prepared-statement,Objective C,Sqlite,Prepared Statement,我的第一个问题是stackoverflow,我真的希望你们能帮我 我一直在努力使准备好的语句在目标C中运行,到目前为止效果良好。 但现在,当我尝试添加曲目时,我的数据库中不断出现“Constraint failed”(约束失败) 我已经删除了数据库并再次创建了它,但错误仍然存在。 此外,我一直在寻找重复的关键,但我没有看到我添加一个重复的任何地方。 “位置”表添加得很好,而且它的构建方式基本相同 我的数据库: CREATE TABLE locations (LocationID INTE

我的第一个问题是stackoverflow,我真的希望你们能帮我

我一直在努力使准备好的语句在目标C中运行,到目前为止效果良好。 但现在,当我尝试添加曲目时,我的数据库中不断出现“Constraint failed”(约束失败)

我已经删除了数据库并再次创建了它,但错误仍然存在。 此外,我一直在寻找重复的关键,但我没有看到我添加一个重复的任何地方。 “位置”表添加得很好,而且它的构建方式基本相同

我的数据库:

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=“插入到曲目(标题、描述、StartTrackDeviceTime、EndTrackDeviceTime)值(?,?,?)”;
if(sqlite3\u prepare\u v2(db.dataBase,sqlTrack,-1,&addTrackStatement,NULL)!=SQLITE\u OK){
NSLog(@“错误:%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(@“将执行该语句”);
if(SQLITE_DONE!=sqlite3_步骤(addTrackStatement)){
NSLog(@“第一步失败”);
NSLog(@“错误:%s”,sqlite3_errmsg(db.dataBase));
返回否;
}
否则{
long insertedTrack=sqlite3\u last\u insert\u rowid(db.dataBase);
NSLog(@“在磁道上插入的id:%ld”,insertedTrack);
//这里我还添加了位置
sqlite3\u清除\u绑定(addTrackStatement);
sqlite3_重置(addTrackStatement);
}
此行应:

sqlite3_bind_text(addLocationStatement, 3, [[dateFormatter stringFromDate:track.startTime] UTF8String], -1, SQLITE_TRANSIENT);
阅读:


track.title&description字段中包含哪些内容,以及NSDateFormatter行中包含哪些内容?在调用四个sqlite3_bind_文本函数之前,我会准确地记录传递给它们的内容,并在这里发布。也许有些东西不是你所期望的(例如“或”而不是“零”)或者是一个空白的日期,其中有一个NOTNULL约束。我在所有内容上都使用了NSLog,所有的值都用很好的标题填充:MyTitle Descr:MyDescr Startdate:2012-04-19 10:26:52GMT+02:00 Enddate:2012-04-19 10:26:52GMT+02:00 NSDateFormatter构建如下:dateFormatter=[[NSDateFormatter alloc]init];[日期格式化程序setDateFormat:@“yyyy-MM-dd HH:MM:ss zzz”];Dateformatter还可以在其正常工作的位置使用。嗯。另一个用户在这里有一个类似的问题:。提供的解决方案是使用替代的插入语法。现在我不推荐它,因为我不喜欢它,但这会使问题消失吗?这确实会使问题消失。但是如果是这样的话,绑定有什么问题吗?是的,这也是我困惑的地方;还有为什么我没有把它作为问题的答案。在我的书中,完全回避这个问题并不是真正的答案D
sqlite3_bind_text(addTrackStatement, 3, [[dateFormatter stringFromDate:track.startTime] UTF8String], -1, SQLITE_TRANSIENT);