SQLite iPhone - Ошибка вставки - PullRequest
2 голосов
/ 26 июня 2010

Я пытаюсь вставить значение в базу данных SQLite, но каждый раз, когда я пытаюсь, моя программа просто падает без сообщения об ошибке вообще.

Вот мой код:

- (void) insertToDatabase:(NSString *) refName {

    // The Database is stoed in the application bundle
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"staticdata.sqlite"];

    if(sqlite3_open([path UTF8String], &database) == SQLITE_OK){
        const char *sql = "Insert into usersDates(dateDescription) VALUES (?)";
        sqlite3_stmt *init_statement;
        sqlite3_bind_text(init_statement, 1, [refName UTF8String], -1, SQLITE_TRANSIENT);


        if(!sqlite3_prepare_v2(database, sql, -1, &init_statement, NULL) == SQLITE_OK){
            NSAssert1(0, @"Failed to insert to database file with message '%s'.", sqlite3_errmsg(database));
        }
        if(sqlite3_step(init_statement) != SQLITE_DONE ) {
            NSLog( @"Error: %s", sqlite3_errmsg(database) );
        } else {
            NSLog( @"Insert into row id = %d", sqlite3_last_insert_rowid(database));
        }

        sqlite3_finalize(init_statement);
    } else {
        sqlite3_close(database);
        NSAssert1(0, @"Failed to open database file with message '%s'.", sqlite3_errmsg(database));
    }

}

Кажется, ошибка возникает в операторе bind. Я подтвердил, что база данных действительно открывается, и refname правильно передается моему методу.

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

1 Ответ

2 голосов
/ 26 июня 2010

Порядок ваших утверждений неверен.bind_() используется после prepare() документации SQLite bind ()

Первый аргумент подпрограммы sqlite3_bind _ * () всегда является указателем на объект sqlite3_stmt, возвращаемый из sqlite3_prepare_v2 () илиего варианты.

    const char *sql = "Insert into usersDates(dateDescription) VALUES (?)";
    sqlite3_stmt *init_statement;

    if(!sqlite3_prepare_v2(database, sql, -1, &init_statement, NULL) == SQLITE_OK){
        NSAssert1(0, @"Failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
    }
    sqlite3_bind_text(init_statement, 1, [refName UTF8String], -1, SQLITE_TRANSIENT);

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