如何更新sqlite3中的条目?

时间:2013-10-10 18:30:11

标签: ios sqlite sql-update

我是ios(Objective-C)和sql和Im的新手,遵循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:action实际更新数据库中的条目而不是仅仅被拒绝? 谢谢!

1 个答案:

答案 0 :(得分:0)

  

“我想扩展它,以便在我尝试输入现有的注册码时,它   将使用新的属性覆盖剩余的属性“

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

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

如果你是sql和objective c的初学者,我建议我创建一个针对初学者的sqlite包装:TankDB

编辑:

代码示例:

  

插入或替换studentDetail(regno,name,department,year)值(\“%d \”,\“%@ \”,\“%@ \”,\“%@ \”)“

请参阅this question以确保您实际上并不想使用'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);