iphone sqlite «не удается открыть файл базы данных» когда-нибудь - PullRequest
3 голосов
/ 13 декабря 2010

Я использую класс базы данных для использования базы данных sqlite

#import "DatabaseConnection.h"

@implementation DatabaseConnection
-(void)DBInitalize{
    databaseName = @"sensorystimulation.sql";
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
    [self checkAndCreateDatabase];
    [self readFromDatabase];
}
-(NSMutableArray *)settingsData{
    return settingsArray;
}

-(void)checkAndCreateDatabase{
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    success = [fileManager fileExistsAtPath:databasePath];
    if(success)
        return;

    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
}
-(void)readFromDatabase{
    settingsArray = [[NSMutableArray alloc] init];
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        const char *sqlStatementNew = "my sql query";
        sqlite3_stmt *compiledStatementNew;
        if(sqlite3_prepare_v2(database, sqlStatementNew, -1, &compiledStatementNew, NULL) == SQLITE_OK) {
            while(sqlite3_step(compiledStatementNew) == SQLITE_ROW) {
                NSString *key_name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatementNew, 0)];
                NSString *key_value = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatementNew, 1)];
                NSMutableDictionary *tempDic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:key_name,@"key_name",key_value,@"key_value",nil];
                [settingsArray addObject:tempDic];
                [tempDic release];
            }
            sqlite3_finalize(compiledStatementNew);
        }
    }
}
-(void)updateSettings:(NSMutableArray *)values{
    for (int l=0; l<[values count]; l++) {
        NSString *key_name = [[values objectAtIndex:l] objectForKey:@"key_name"];
        NSString *key_value = [[values objectAtIndex:l] objectForKey:@"key_value"];
        sqlite3_stmt *updateStmt;
        NSString *ts=[NSString stringWithFormat:@"UPDATE table key_value='%@' where key_name='%@'",key_value,key_name];
        const char *sql = [ts cStringUsingEncoding:1];
        if(sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) != SQLITE_OK){
            NSLog(@"Error while creating update statement. '%s'", sqlite3_errmsg(database));
        }
        if(SQLITE_DONE != sqlite3_step(updateStmt)){
            NSLog(@"%@",ts);
            NSLog(@"Error while updating. '%s'", sqlite3_errmsg(database));
        }
    }
}

-(void)quitApp{
    sqlite3_close(database);
}
@end

и вызывая свой объект следующим образом

инициализировать

databaseConnection = [[DatabaseConnection alloc] init];
[databaseConnection DBInitalize];

Обновление БД

NSMutableArray *valueArray = [[NSMutableArray alloc] init];
[valueArray addObject:[[[NSMutableDictionary alloc] initWithObjectsAndKeys:@"abc",@"key_name",[NSString stringWithFormat:@"%d",abc],@"key_value",nil] autorelease]];
[valueArray addObject:[[[NSMutableDictionary alloc] initWithObjectsAndKeys:@"xyz",@"key_name",[NSString stringWithFormat:@"%d",xyz],@"key_value",nil] autorelease]];
[databaseConnection updateSettings:valueArray];
[valueArray release];

Работает нормально. не проблема использует

Но после большого обновления примерно 100-200 раз появляется следующий журнал (ошибка) ... и после него каждый раз возникает эта ошибка, и я не могу обновить БД. после этого я должен выйти из приложения, то я снова все работает нормально

Error while updating. 'unable to open database file'

и из-за этого другие мои функции также не работают после возникновения ошибки, эта вкладка в представлении изображения

Любая идея относится к этому. пожалуйста, помогите.

-Амит Баттан

1 Ответ

0 голосов
/ 14 марта 2011

1) Вы смотрели на эти два вопроса:
невозможно открыть базу данных
Ошибка открытия Sqlite: невозможно открыть базу данных

Вы можете столкнуться с похожими проблемами, описанными в приведенных выше вопросах.
Похоже, что вам не хватает sqlite3_finalize в "updateSettings".
Вы закрываете БД каждый раз, когда выпускаете «databaseConnection»?

2)
Вы открываете БД 100-200 раз?
Если это так, возможно, вам следует подумать о том, является ли это лучшим подходом для вашего приложения.

Думали ли вы об использовании Singleton для доступа к БД? -> Откройте DB один раз во время инициализации, а затем повторно используйте соединение каждый раз. Это может не только ускорить ваше приложение, но и уменьшить использование памяти. Проверить:
http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
Принимая решение об этом, вы должны учитывать, если в вашем приложении несколько потоков одновременно обращаются к БД.

Best
Ральф

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