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