Обновить таблицу SQLite в моем приложении для iPhone

#iphone #objective-c #sqlite

#iPhone #objective-c #sqlite

Вопрос:

Я хочу, чтобы в моем приложении можно было вставлять данные в базу данных sqlite, и если идентификатор, например, существует, чтобы обновить эту строку.

я выполнил создание с помощью :

     if (sqlite3_open([path UTF8String], amp;database) == SQLITE_OK) {
            sqlite3_stmt *insertStmt = nil;

            if(insertStmt == nil) 
            {
                const char *insertSql = "INSERT INTO Category (id,name) VALUES(?,?)";
                if(sqlite3_prepare_v2(database, insertSql, -1, amp;insertStmt, NULL) != SQLITE_OK)
                    NSAssert1(0, @"Error while creating insert statement. '%s'", sqlite3_errmsg(database));
            }

            sqlite3_bind_int(insertStmt, 1, 135);
            sqlite3_bind_text(insertStmt, 2, [@"fds" UTF8String], -1, SQLITE_TRANSIENT);

            if(SQLITE_DONE != sqlite3_step(insertStmt))
                NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
            else
                //NSLog("Inserted");
            //Reset the add statement.
            sqlite3_reset(insertStmt);
            insertStmt = nil;
        }
        sqlite3_close(database);
  

Ответ №1:

Используйте OR REPLACE квалификатор:

 INSERT OR REPLACE INTO Category ...
  

Это зависит от наличия УНИКАЛЬНОГО ограничения (обычно первичного ключа), содержащего только id столбец.

Комментарии:

1. но это утверждение создает повторяющиеся строки в таблице

2. Я только что внес изменения в свой ответ, чтобы объяснить ключевое требование (извините за каламбур).

Ответ №2:

Вы можете использовать следующий код для обновления:

-(void) Обновление:(NSString *)запрос {

 sqlite3_stmt *statement=nil;

NSString *path = [self GetDatabasePath:DataBaseName] ;

if(sqlite3_open([path UTF8String],amp;databaseObj) == SQLITE_OK)
{
    if(sqlite3_prepare_v2(databaseObj, [query UTF8String], -1, amp;statement, NULL) == SQLITE_OK)
    {
        sqlite3_step(statement);
    }
    sqlite3_finalize(statement);
}
if(sqlite3_close(databaseObj) == SQLITE_OK){

}else{
    NSAssert1(0, @"Error: failed to close database on memwarning with message '%s'.", sqlite3_errmsg(databaseObj));
}
  

}