2012-04-19 190 views
2

我在stackoverflow上的第一个问题,我真的希望你们能帮助我。SQLITE3约束失败

我一直在试图准备在目标C中运行的语句,所以目前为止这么好。 但是现在,当我试图添加曲目时,我一直在我的数据库中收到“约束失败”。

我已经删除了数据库并重新创建了它,但错误依然存在。 此外,我一直在调查重复键,但我没有看到我在任何地方添加重复。 位置表添加得很好,它的构建方式相同。

我的DB:

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); 
} 
+0

什么是其中所包含的track.title和描述字段,以及NSDateFormatter行的内容是什么?我会记录到底是什么被传入四个sqlite3_bind_text函数之前,他们被称为并张贴在这里。也许某些东西不是你所期望的(例如“”或而不是nil),或者你有一个非空约束的空白日期。 – Diziet 2012-04-19 08:20:23

+0

我使用的NSLog上的一切,所有的值都填了就好 标题:MyTitle DESCR: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也用于它的工作地点很好 – Tikkes 2012-04-19 08:29:26

+0

很酷。嗯。另一个用户在这里有一个类似的问题:http://stackoverflow.com/questions/9426843/iphone-sqliteconstraint-failed-error。提供的解决方案是使用替代插入语法。现在我不推荐它,因为我不喜欢它,但这是否会让问题消失? – Diziet 2012-04-19 08:37:23

回答

1

若本线:

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

读:

sqlite3_bind_text(addTrackStatement, 3, [[dateFormatter stringFromDate:track.startTime] UTF8String], -1, SQLITE_TRANSIENT); 
相关问题