0

我对 ios (Objective-C) 和 sql 非常陌生,我正在遵循此处找到的 sqlite (特别是 sqlite3) 教程:http ://www.tutorialspoint.com/ios/ios_sqlite_database.htm 我正确地实现了一切。问题是,如果我尝试使用相同的 reg id(用于在数据库中查找元素的主键)输入信息,它会抱怨该键不是唯一的。

- (BOOL) saveData:(NSString*)registerNumber name:(NSString*)name
   department:(NSString*)department year:(NSString*)year;
    {
    const char *dbpath = [databasePath UTF8String];
    if (sqlite3_open(dbpath, &database) == SQLITE_OK)
    {
        NSString *insertSQL =
        [NSString stringWithFormat:@"insert into studentsDetail (regno,name, department, year) values (\"%d\",\"%@\", \"%@\", \"%@\")",[registerNumber integerValue], name, department, year];

        const char *insert_stmt = [insertSQL UTF8String];
        sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL);
        int s = sqlite3_step(statement);
        const char *errmsg = sqlite3_errmsg(database);
        if (s == SQLITE_DONE)
        {
            sqlite3_reset(statement);
            return YES;
        }
        else {
            sqlite3_reset(statement);
            return NO;
        }
    }
    return NO;
}

如何进行 saveData: 操作实际上更新数据库中的条目,而不是仅仅被拒绝?谢谢!

4

1 回答 1

0

“我想扩展它,这样如果我尝试输入现有的 reg id,它将用新的属性覆盖剩余的属性”

如果这是您想要完成的,那么您不应该使用 INSERT 语句。主键的目的是保护数据库免受具有相同主键的重复行的影响。当你这样看时,拒绝是恰当的。

你真正想要的是使用INSERT OR REPLACE

如果您是 sql 和 Objective c 的初学者,我会推荐我创建的针对初学者的 sqlite 包装器:TankDB

编辑:

代码示例:

INSERT OR REPLACE INTO studentsDetail (regno,name, department, year) values (\"%d\",\"%@\", \"%@\", \"%@\")"

请参阅此问题以确保您实际上并不是要使用“UPSERT”。请注意,INSERT OR REPLACE 不会使用新信息更新现有行。它将完全删除现有行并替换它。

Edit2:打开、准备、步骤、完成、关闭

const char *dbpath = [_databasePath UTF8String];
if(sqlite3_open(dbpath, &_database) == SQLITE_OK) {
    const char *command = [query UTF8String];

    // Perform the query
    if (sqlite3_prepare_v2(_database, command, -1, &selectstmt, NULL) == SQLITE_OK) {

        // For each row returned
        while (sqlite3_step(selectstmt) == SQLITE_ROW) {
            // Do stuff
        }
    }
    sqlite3_finalize(selectstmt);
}

sqlite3_close (_database);
于 2013-10-11T22:09:41.530 回答