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

イメージ名のような多くのデータを取得し、そのようなコードを使用したユーザー入力に依存するそれらの組み合わせを表示しています:

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

[championSelection setBackgroundImage:tempImage forState:UIControlStateNormal];

私の問題:

アプリをしばらく実行して大量のデータを取得すると、エラーがスローされ ます

私の推測では、getCountersByID が呼び出されるたびにデータベースを開いていますが、閉じていません。

私の質問:

私が使用しているデータベースを開いたり閉じたりするために正しいアプローチを使用していますか?


この問題を解決するのに役立たなかった同様の質問:

  1. データベースを開くことができません
  2. Sqlite オープニング エラー: データベースを開けません

更新

このコード行を使いすぎているため、エラーが表示されていると仮定しました。

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

エラー24で終了します。

だから私はそれらをグローバルにしましたが、sqlite3_errmsgは同じエラー24を示していますが、アプリは今でははるかに高速に実行されます

4

2 に答える 2

2

DB基本的にフェーズにいるときは一度だけ開く必要がありますが、initializationに情報を要求しているときは開きませんDB。ただし、リクエストごとにDBを開いてから閉じるように見えるため、コードが失敗することはありません。これらのイベントをログに記録するか、コードを介してデバッグして、これが発生していることを確認してください。

于 2012-11-10T13:36:06.573 に答える
1

あなたが示したコードはデータベースを閉じます。そのため、他の場所でデータベースを閉じるのを忘れているか、他のファイルが繰り返し開かれているが閉じられていない可能性があります。

于 2012-11-10T13:42:39.093 に答える