IOS sqlite3_open не удается в 50-й раз, что называется - PullRequest
1 голос
/ 14 сентября 2011

У меня странная проблема, я надеюсь исправить:

вот мой код:

-(Shot*) getShot:(int)shot {
    NSString *sqlStr = [NSString stringWithFormat:@"SELECT * FROM tbShots where nShot = %d ", shot];
    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *documentFolderPath = [searchPaths objectAtIndex:0];
    NSString *dbFilePath = [documentFolderPath stringByAppendingPathComponent:DATABASE_NAME_EXT];

    if (dbFilePath == NULL) {
        NSLog(@"dbFilePath is NULL");
    }

    sqlite3 *dbHandle;
    if (sqlite3_open([dbFilePath UTF8String], &dbHandle)) {
        NSLog(@"sqlite3_open: failed");
    }

    sqlite3_stmt *preparedStatement;
    const char* queryStatement = [sqlStr UTF8String];
    sqlite3_prepare_v2(dbHandle, queryStatement, -1, &preparedStatement, NULL);

    Shot *s = nil;
    NSString * note = @"";
    while( sqlite3_step(preparedStatement) == SQLITE_ROW)
    {
        s = [[[Shot alloc] initWithShot:shot] autorelease];
    }

    sqlite3_finalize(preparedStatement);
    sqlite3_close(dbHandle);    
    return s;
}

и, кажется, теперь работает нормально: но у меня есть проблема:

Я вызываю эту функцию много раз, и когда я вызываю ее в 50-й раз, функция sqlite3_open завершается ошибкой (я вижу ошибку журнала 'sqlite3_open: failed' ...

Я допустил ошибку? Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 26 декабря 2012

У меня была та же проблема - чтобы решить ее, вы должны открыть БД при запуске приложения и закрыть БД при выходе пользователя из приложения. ВЫ НЕ ДОЛЖНЫ ОТКРЫТЬ И ЗАКРЫТЬ БД ДЛЯ КАЖДОГО ЗАПРОСА !!!!

0 голосов
/ 03 июля 2012

Привет @ghiboz У меня была такая же проблема, попробуйте это, я решил свою проблему:)

- (NSMutableArray *) SELECT_LANES_IN_POSITIONS:(NSString *)lanes{

sqlite3 *db;

const char *path = [[self getDBPathiPhone] UTF8String];

int v_Open = sqlite3_open(path, &db);

if(v_Open == SQLITE_OK){

    NSString *sqlS = [NSString stringWithFormat:@"THE SQL STATEMENT" , Some];

    const char *sql = [sqlS cStringUsingEncoding:NSUTF8StringEncoding];

    sqlite3_stmt *stmt;

    int v_prepare = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);

    if(v_prepare == SQLITE_OK){

        while ((sqlite3_step(stmt)) == SQLITE_ROW) {

        } 

    }else{

        NSLog(@"FAIL :: SELECT :: %i", v_prepare);

    }

    sqlite3_reset(stmt);
    sqlite3_finalize(stmt);

}else{

    NSLog(@"FAIL :: OPEN :: %i", v_Open);
}

sqlite3_close(db);

return nil;


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