Почему я не могу обновить оператор в SQLite? - PullRequest
0 голосов
/ 19 января 2012

Может ли кто-нибудь помочь мне с этим фрагментом кода:

-(void) updateData:(NSString*)value1:(NSString*)value2
 {
    sqlite3* database;
    databaseName = @"AppDB.sqlite";
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

    int databaseReturnCode = sqlite3_open([databasePath UTF8String], &database);
    if(databaseReturnCode == SQLITE_OK) {

    sqlite3_stmt *updateStmt;
    const char *sql = "update PersonalInfo Set FirstName = ?,LastName = ? Where id = '1'";
    //sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL);
    sqlite3_prepare(database, sql, -1, &updateStmt,nil);

    sqlite3_bind_text(updateStmt, 1, [value1 UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(updateStmt, 2, [value2 UTF8String], -1, SQLITE_TRANSIENT);


    printf( "Update PersonalInfo| error or not an error? :  %s\n", sqlite3_errmsg(database) ); 

    while(sqlite3_step(updateStmt) == SQLITE_ROW) 
    {
        NSString *aFirstName  = [NSString stringWithUTF8String:(char *)sqlite3_column_text(updateStmt, 1)];
        NSString *aLastName  = [NSString stringWithUTF8String:(char *)sqlite3_column_text(updateStmt, 2)];


        ProfileInfo *profile = [[ProfileInfo alloc]initWithFirstName:(NSString*)aFirstName LastName:(NSString*)aLastName];
        [personalInfo addObject:profile];
        [profile release];
    }
        sqlite3_reset(updateStmt);
        sqlite3_finalize(updateStmt);
    }

}
    sqlite3_close(database);    
}

Он не входит в цикл while.Но если я удаляю цикл while и заключаю код в блок try-catch, я получаю следующее исключение:

+[NSString stringWithUTF8String:]: NULL cString

1 Ответ

2 голосов
/ 19 января 2012

Цикл while sqlite_step не подходит для оператора обновления.

Из документации на sqlite.org:

sqlite3_step () Эта подпрограмма используется для оценки подготовленного оператора, который был ранее создан sqlite3_prepare () интерфейс.Оператор оценивается до точки, в которой доступен первый ряд результатов.Чтобы перейти ко второму ряду результатов, снова вызовите sqlite3_step ().Продолжайте вызывать sqlite3_step (), пока инструкция не будет завершена. Операторы, которые не возвращают результаты (например, операторы INSERT, UPDATE или DELETE), выполняются до завершения при одном вызове sqlite3_step () .

Проверьте возвращаемое значение sqlite_step.Это должно быть что-то вроде SQLITE_DONE, а не SQLITE_ROW.

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