次のコードのように、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];
私の問題:
アプリをしばらく実行して大量のデータを取得すると、エラーがスローされ ます。
私の推測では、getCountersByID が呼び出されるたびにデータベースを開いていますが、閉じていません。
私の質問:
私が使用しているデータベースを開いたり閉じたりするために正しいアプローチを使用していますか?
この問題を解決するのに役立たなかった同様の質問:
更新:
このコード行を使いすぎているため、エラーが表示されていると仮定しました。
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *databasePath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"DatabaseCounters.sqlite"];
BOOL success = [fileManager fileExistsAtPath:databasePath];
エラー24で終了します。
だから私はそれらをグローバルにしましたが、sqlite3_errmsgは同じエラー24を示していますが、アプリは今でははるかに高速に実行されます