sqlite 3 numéro d'ouverture

Je reçois mes données, avec plusieurs methods similaires, à partir du file sqlite3 comme dans le code suivant:

-(NSMutableArray *) getCountersByID:(NSSsortingng *) championID{ NSMutableArray *arrayOfCounters; arrayOfCounters = [[NSMutableArray alloc] init]; @try { NSFileManager *fileManager = [NSFileManager defaultManager]; NSSsortingng *databasePath = [[[NSBundle mainBundle] resourcePath ]ssortingngByAppendingPathComponent:@"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 UTF8Ssortingng], &database) == SQLITE_OK){ NSSsortingng *tempSsortingng = [NSSsortingng ssortingngWithFormat:@"SELECT COUNTER_ID FROM COUNTERS WHERE CHAMPION_ID = %@",championID]; const char *sql = [tempSsortingng cSsortingngUsingEncoding:NSASCIISsortingngEncoding]; 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 = [NSSsortingng ssortingngWithUTF8Ssortingng:(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 } 

alors j'obtiens l'access aux données avec ceci et d'autres lignes semblables de code:

 myCounterList *MyCounterList = [[myCounterList alloc] init]; countersTempArray = [MyCounterList getCountersByID:"2"]; [countersArray addObject:[NSSsortingng ssortingngWithFormat:@"%@",(((counterList *) [countersTempArray objectAtIndex:i]).counterID)]]; 

Je reçois beaucoup de données comme le nom de l'image et en montrant la combinaison de ceux-ci qui dépend de la saisie des users avec un tel code:

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

Mon problème:

Quand je cours mon application pendant un certain time et obtiens beaucoup de données il jette l'erreur: "problème avec l'ouverture de database incapable d'ouvrir le dossier de database – erreur = 24 (Trop de dossiers ouverts) "

Ma conjecture est que j'ouvre ma database chaque fois que getCountersByID est appelé mais ne le ferme pas.

Ma question:

Suis-je en utilisant la bonne approche pour ouvrir et fermer la database que j'utilise?


Des questions similaires qui ne m'ont pas aidé à résoudre ce problème:

  1. incapable d'ouvrir la database
  2. Erreur d'ouverture Sqlite: Impossible d'ouvrir la database

MISE À JOUR :

J'ai supposé que l'erreur apparaissait parce que j'utilise trop ces lignes de code:

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

et se terminant par l'erreur 24.

Donc, je les ai fait global mais sqlite3_errmsg montre même erreur 24, mais l'application fonctionne beaucoup plus vite maintenant

Vous devriez ouvrir votre base de DB seulement une fois quand vous êtes dans la phase d' initialization mais pas quand vous requestz des informations à votre base de DB . Votre code ne devrait pas échouer puisque vous semblez ouvrir puis fermer le DB après chaque requête. Assurez-vous que cela se produit en enregistrant ces events ou en déboguant dans votre code.

Le code que vous avez montré ferme la database, il est donc probable que vous oubliez de le fermer dans un autre endroit, ou qu'un autre file est ouvert à plusieurs resockets mais jamais fermé.