【问题标题】:ios sqlite3_open fails the 50th time that is calledios sqlite3_open 第 50 次调用失败
【发布时间】:2011-09-13 21:34:47
【问题描述】:

我有一个奇怪的问题,我希望解决:

这是我的代码:

-(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'...

我犯了一些错误? 提前谢谢

【问题讨论】:

  • 你能发布错误代码 NSLog(@"Failed to open database with error %s",sqlite3_errmsg(dbHandle));

标签: objective-c ios sqlite database-connection


【解决方案1】:

我遇到了同样的问题 - 要解决它,您必须在应用启动时打开数据库,并在用户离开应用时关闭数据库。您不应该为每个查询打开和关闭数据库!!!!

【讨论】:

    【解决方案2】:

    嗨@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;
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      相关资源
      最近更新 更多