Невозможно открыть файл базы данных - PullRequest
0 голосов
/ 06 июля 2011

У меня есть приложение, которое позволяет вам добавлять элементы в список (из таблицы), когда пользователь нажимает кнопку добавления рядом с соответствующим элементом, он вызывает следующий метод + (void) addItem.Все работает нормально, но после тяжелого тестирования (60-70 вставок подряд приводит к тому, что он возвращает код ошибки SQL «Невозможно открыть файл базы данных», и приложение должно быть перезапущено. Любые идеи? Спасибо!

+(void)addItem:(NSString *)dbPath{

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

NSString *oldTrip = [prefs objectForKey:@"selectedList"];

NSString *table = @"The Table";

NSString *name = [prefs objectForKey:@"SelectedAddItem"];    
NSString *countStr = @"1";
NSString *doneStr = @"No";
NSString *noteStr = @"None";
NSString *orderStr = @"15";


sqlite3 *database;


if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {

    const char *sqlStr = [[NSString stringWithFormat:@"Insert into '%@' Values (null,?,?,?,?,?,?)",oldTrip]UTF8String];        

    sqlite3_stmt *compiledStatement;


    if (sqlite3_prepare_v2(database, sqlStr, -1, &compiledStatement, NULL) == SQLITE_OK){

        sqlite3_bind_text(compiledStatement, 0,[oldTrip UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(compiledStatement, 1,[name UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(compiledStatement, 2,[table UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(compiledStatement, 3,[countStr UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(compiledStatement, 4,[doneStr UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(compiledStatement, 5,[noteStr UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(compiledStatement, 6,[orderStr UTF8String], -1, SQLITE_TRANSIENT);

    }

    if(sqlite3_step(compiledStatement) != SQLITE_DONE ) {


        NSString* messageString = [NSString stringWithFormat: @"%s\n\nPlease contact the developer if this error persists", sqlite3_errmsg(database)]; 

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error inserting" message:messageString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];


        [alert show];
        [alert release];

    } else {

        sqlite3_reset(compiledStatement);

        sqlite3_finalize(compiledStatement);
    }

}

sqlite3_close(database);

}

Для получения информации о БД я использую:

- (NSString *) getDBPath {

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
return [documentsDir stringByAppendingPathComponent:@"ListDatabase.sql"];
}

1 Ответ

0 голосов
/ 06 июля 2011

Если это происходит только при большой нагрузке, вы можете оставить файл базы данных открытым, а не открывать и закрывать его для каждой операции.Я не очень знаком с SQLite, но вы также можете повторно использовать скомпилированный оператор, просто сбрасывая его привязки каждый раз (и вам не нужно вызывать reset до finalize, если вы не собираетесьдля повторного использования выражения).

Возможно, вы можете открыть и закрыть свою базу данных в методах viewDidLoad и viewDidUnload вашего контроллера представления?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...