2

スタックオーバーフローに関する私の最初の質問です。皆さんが私を助けてくれることを本当に願っています。

私はプリペアドステートメントをObjectiveCで実行しようとしてきましたが、これまでのところ非常に優れています。しかし、トラックを追加しようとすると、データベースで「制約に失敗しました」というメッセージが表示され続けます。

すでに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);
}
4

1 に答える 1

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);
于 2012-04-19T08:57:55.583 に答える