sqlite 3开放问题

时间:2012-11-10 13:12:50

标签: iphone ios xcode sqlite

我从sqlite3文件中获取了几个类似方法的数据,如下面的代码所示:

-(NSMutableArray *) getCountersByID:(NSString *) championID{

    NSMutableArray *arrayOfCounters;
    arrayOfCounters = [[NSMutableArray alloc] init];

    @try {
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSString *databasePath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"DatabaseCounters.sqlite"];
        BOOL success = [fileManager fileExistsAtPath:databasePath];

        if (!success) {
            NSLog(@"cannot connect to Database! at filepath %@",databasePath);
        }
        else{
            NSLog (@"SUCCESS getCountersByID!!");
        }
        if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK){

            NSString *tempString = [NSString stringWithFormat:@"SELECT COUNTER_ID FROM COUNTERS WHERE CHAMPION_ID = %@",championID];
            const char *sql = [tempString cStringUsingEncoding:NSASCIIStringEncoding];
            sqlite3_stmt *sqlStatement;

            int ret = sqlite3_prepare(database, sql, -1, &sqlStatement, NULL);

            if (ret != SQLITE_OK) {
                NSLog(@"Error calling sqlite3_prepare: %d", ret);
            }
            if(sqlite3_prepare_v2(database, sql, -1, &sqlStatement, NULL) == SQLITE_OK){

                while (sqlite3_step(sqlStatement)==SQLITE_ROW) {
                    counterList *CounterList = [[counterList alloc]init];
                    CounterList.counterID = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,0)];
                    [arrayOfCounters addObject:CounterList];
                }
            }
            else{
                NSLog(@"problem with database prepare");
            }
            sqlite3_finalize(sqlStatement);
        }
        else{
            NSLog(@"problem with database openning %s",sqlite3_errmsg(database));
        }   
    }
    @catch (NSException *exception){
        NSLog(@"An exception occured: %@", [exception reason]);
    }
    @finally{
        sqlite3_close(database);
        return arrayOfCounters;
    }
    //end
}

然后我可以使用此代码和其他类似代码访问数据:

myCounterList *MyCounterList = [[myCounterList alloc] init];
countersTempArray = [MyCounterList getCountersByID:"2"];

[countersArray addObject:[NSString stringWithFormat:@"%@",(((counterList *) [countersTempArray objectAtIndex:i]).counterID)]];

我获取了大量数据,例如图片名称,并显示了这些数据的组合,这取决于用户输入此类代码:

UIImage *tempImage = [UIImage imageNamed:[NSString stringWithFormat:@"%@_0.jpg",[countersArray objectAtIndex:0]]];

[championSelection setBackgroundImage:tempImage forState:UIControlStateNormal];

我的问题:

当我运行我的应用程序一段时间并获得大量数据时,它会抛出错误:"数据库打开无法打开数据库文件的问题 - 错误= 24(打开文件过多)"

我的猜测是,每次调用getCountersByID但不关闭它时,我都会打开我的数据库。

我的问题:

我使用正确的方法来打开和关闭我使用的数据库吗?


类似的问题没有帮助我解决这个问题:

  1. unable to open database
  2. Sqlite Opening Error : Unable to open database

  3. 更新

    我假设错误出现了,因为我过多地使用这行代码:

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *databasePath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"DatabaseCounters.sqlite"];
    BOOL success = [fileManager fileExistsAtPath:databasePath];
    

    并以错误24结束。

    所以我将它们设为全局,但 sqlite3_errmsg 显示相同的错误24,但现在应用程序运行得更快

2 个答案:

答案 0 :(得分:2)

当您处于DB阶段时,您应该只打开initialization一次,而不是在向DB请求某些信息时。您的代码应该不会失败,因为您似乎打开然后在每个请求后关闭数据库。通过记录这些事件或通过代码调试来确保发生这种情况。

答案 1 :(得分:1)

您显示的代码会关闭数据库,因此您可能忘记在其他地方关闭它,或者某些其他文件被重复打开但从未关闭。