Привет, я пишу приложение для iphone, которое требует sqlite и один запрос на обновление. Так просто, почему это работает:
NSString *query=[NSString stringWithFormat:@"%@%@%@%@%@",
@"UPDATE ZTABELLA SET ZTYPE =",@"1",
@" WHERE ZNAME='",@"stringaoggetto",@"';"];
sqlite3_exec(database2, [query UTF8String], NULL, NULL, NULL);
и почему это не работает:
NSString *query=[NSString stringWithFormat:@"%@%@%@%@%@",
@"UPDATE ZTABELLA SET ZTYPE =",@"1",
@" WHERE ZNAME='",oggetto,@"';"];
sqlite3_exec(database2, [query UTF8String], NULL, NULL, NULL);
Разница между этими двумя примерами составляет всего @"stringaoggetto"
в первом и oggetto
во втором. В первом я вставил значение непосредственно со строкой, во втором примере oggetto
это объект nsstring, который имеет правильное значение внутри (я напечатал nslog). Почему эта разница?
Журнал для запроса одинаков для каждого примера:
NSLog(@" %@",query);
//this log print: UPDATE ZTABELLA SET ZTYPE =1 WHERE ZNAME='stringaoggetto';
Журнал для объекта nsstring "oggetto":
NSLog(@"%@",oggetto);
//this log print stringaoggetto
Я также попробовал другой код для проверки ошибки, но результат тот же:
if (sqlite3_open([dbPath2 UTF8String], &database2) == SQLITE_OK) {
const char *update = "UPDATE ZTABELLA SET ZTYPE =1 WHERE ZNAME=?";
sqlite3_stmt *updatestmt;
if(sqlite3_prepare_v2(database2, update, -1, &updatestmt, NULL) == SQLITE_OK) {
sqlite3_bind_text(updatestmt, 1, [oggetto UTF8String] , -1, SQLITE_TRANSIENT);
if(SQLITE_DONE != sqlite3_step(updatestmt)){
NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(database2));
}
sqlite3_reset(updatestmt);
}
else {
NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(database2));
}
}
В качестве первого прямого запроса (с sqlite3_exc) в этом случае sqlite3_bind_text не работает после предложения where. С тем же запросом, если я пытаюсь в целях тестирования установить столбец ZTYPE вместо ZNAME (однако любой другой столбец нельзя установить «Где»), он работает. Почему?
Это начало oggetto nsstring, это результат запроса select:
NSMutableString *oggetto;
oggetto=[NSString stringWithCString:(char *)sqlite3_column_text(selectstmt, 0)];
эта строка правильно сохраняет значение (значение "stringaoggetto"), я попытался с помощью nslog.