sqlite 3开放问题

我从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)]]; 

我得到了很多像图像名称的数据,并显示这些数据的组合,这取决于用户input这样的代码:

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

我的问题:

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

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

我的问题:

我用正确的方法打开和closures我使用的数据库?


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

  1. 无法打开数据库
  2. Sqlite的开放错误:无法打开数据库

更新

我做了一个假设,错误显示出来了,因为我使用这些代码太多了:

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

并以错误24结束。

所以我让他们全球但sqlite3_errmsg显示相同的错误24,但现在应用程序运行得更快

基本上,当你处于initialization阶段时,你应该只打开一次DB而不是在向DB请求一些信息时。 你的代码不应该失败,因为你似乎打开然后在每个请求后closures数据库。 通过logging这些事件或通过代码进行debugging,确保发生这种情况。

你所显示的代码确实closures了数据库,所以很可能你忘记了在其他地方closures它,或者反复打开一些其他文件,但是从不closures。