objective-c - SQLITE3 约束失败

标签 objective-c sqlite prepared-statement

我关于 stackoverflow 的第一个问题,我真的希望你们能帮助我。

我一直试图让准备好的语句在 Objective-C 中运行,到目前为止一切顺利。
但是现在,当我尝试添加轨道时,我的数据库中不断出现“约束失败”。

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

我的数据库:

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

最佳答案

这条线是否应该:

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);

关于objective-c - SQLITE3 约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10224023/

相关文章:

ios - 如何解析nsstring中的json数据?

android - 首选项屏幕作为数据库的界面?

c++ - 如何将 std::shared_ptr 与 Mysql 准备好的语句一起使用?

sql - 来自多个表的sql count()

sql - 如何从另一个SQLite表的全部内容更新一个子集?

java - 我的无效字符在哪里 (ORA-00911)

php - mysqli:它可以在一条语句中准备多个查询吗?

objective-c - 当 Action 的发送者是 UIGestureRecognizer 时引用按钮

ios - 如何将 NSString 转换为 int

ios - 如何保护密码字段免受恶意输入?