Sqlite ОБНОВЛЕНИЕ вопрос - PullRequest
0 голосов
/ 17 мая 2011

Привет, я пишу приложение для 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.

1 Ответ

0 голосов
/ 18 мая 2011
  1. Сделайте это вместо этого; [query cStringUsingEncoding: NSUTF8StringEncoding] Я думаю, что это действительно ключ, который вам нужен для решения этой проблемы. Убедитесь, что строка сохраняется; Оба они должны работать.

    NSLog (@ "% s", [query cStringUsingEncoding: NSUTF8StringEncoding]);

    NSLog (@ "% s", [запрос UTF8String]);

  2. Это может также иметь некоторые полезные советы; http://www.how2s.org/index.php/How_to_get_started_with_SQLite_on_the_iPhone Упростите дизайн.

  3. Также следует отметить, что вы используете NULL, NULL, NULL. Получите данные об ошибке из оператора sqlite3_exec. http://www.sqlite.org/c3ref/exec.html имеет справочный материал, с которого можно начать.

  4. Вы перечислили несколько вопросов. Разделите остальных на другие вопросы. Вставки отличаются от обновлений. Сфокусируйте этот вопрос на Обновлении.

  5. Если ничего из этого не помогло, как NSString * oggetto был установлен, где, тот же файл, файл сравнения, это аргумент функции и т. Д.?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...