2012-04-19 22 views
2

私の最初の質問stackoverflowと私は本当に皆さんが私を助けることを願っています。SQLITE3制約が失敗しました

私は目標Cで実行している準備文を取得しようとしています。 しかし、トラックを追加しようとすると、データベース上で「Constraint failed」が表示され続けます。

私はすでにdbを削除して作成しましたが、エラーは残ります。 また、私は重複したキーを調べていますが、どこにでも重複を追加することはありません。 ロケーションテーブルにはうまく追加されており、同じ種類のビルド済みです。

マイ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

内に含まれている何あなたが持っているNSDateFormatterの行によって何が吐き出されるのですか?私は4つのsqlite3_bind_text関数に渡されているものが正確にログされ、呼び出されてここに投稿されます。おそらく、何かが期待通りではないかもしれません(例: ""またはヌルの代わりに)、またはnullでない制約がある空の日付。 – Diziet

+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

+0

Coolうーん。別のユーザーにも同様の質問があります:http://stackoverflow.com/questions/9426843/iphone-sqliteconstraint-failed-errorそのために提供される解決策は、代わりの挿入構文を使用することでした。私はそれが好きではないので、今私はそれを推奨していないが、それは問題を遠ざけることはできますか? – Diziet

答えて

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); 
関連する問題