Странная проблема с базой данных sqlite3 (может написать только один раз) - PullRequest
0 голосов
/ 30 июня 2010

У меня огромная проблема с базой данных sqlite3 на iphone SDK 4. Я могу записать / прочитать базу только один раз! С iphone sdk 3.2 все просто отлично работало.

После первой попытки я получаю сообщение об ошибке «SQLITE_BUSY».

Вот фрагмент моего кода, который я использую:

-(void) addFavoriteOdv:(Odv*)odv name:(NSString*)name;
{
    @synchronized(self)
    {
        if(name == nil)
            name = odv.name;

        NSString* rowId = [self addOdv:odv];

        int existing = [self numberOfFavoriteOdvs:rowId];
        if(existing == 0)
        {
            sqlite3 *database = [self getOpenDatabase];

            const char *insertStatement = [@"insert into favoriteodvs(odv, name) values (?, ?)" UTF8String];

            int retCode = 0;
            sqlite3_stmt *statement;
            retCode = sqlite3_prepare_v2(database, insertStatement, -1, &statement, NULL);

            if(retCode == SQLITE_OK)
            {
                sqlite3_bind_text(statement, 1, [rowId UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(statement, 2, [name UTF8String], -1, SQLITE_TRANSIENT);

                if(sqlite3_step(statement)!= SQLITE_DONE)
                {
                    NSLog(@"SQL Error: %s", sqlite3_errmsg(database));
                    NSLog(@"Inserting FavoriteOdv failed");
                }
            }

            sqlite3_finalize(statement);
            sqlite3_close(database);
        }
    }
}

У кого-нибудь есть идея? Я использую libsqlite3.dylib.

Спасибо, Себастьян

1 Ответ

0 голосов
/ 30 июня 2010

для повторного использования подготовленного вами заявления - вы должны позвонить

sqlite3_reset(statement);

сразу после того, как вы получили SQLITE_DONE от sqlite3_step. После этого вы можете связать другие данные и снова выполнить запрос.

p.s. неправильно:

const char *insertStatement = [@"insert into favoriteodvs(odv, name) values (?, ?)" UTF8String];

правильно:

const char *insertStatement = "insert into favoriteodvs(odv, name) values (?, ?)";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...