2010-12-13 2 views
3

Я использую класс базы данных для использования SQLite базы данныхiphone 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 

и называя его объект, как этот

initilize

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

Update DB

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

Это wo rks штраф. Проблема не в использовании

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

Error while updating. 'unable to open database file' 

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

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

-Amit Battan

+0

Too..Much..Code .. –

+0

да, полный класс код дб .. функция - (Недействительными) updateSettings: (NSMutableArray *) значения имеет проблемы –

ответ

0

1) ли вы посмотрите на эти два вопроса:
unable to open database
Sqlite Opening Error : Unable to open database

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

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

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

Бест,
Ralph