2012-04-19 189 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); 
相關問題