2010-12-13 7 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 

を使用するためのデータベースクラスを使用して、この

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

initilizeアップデートのようにそのオブジェクトを呼び出しています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]; 

これはrks良い。問題ありません

しかし、多くの更新後、約100〜200回次のログ(エラー)が来て、このエラーが発生してDBを更新できません。この後、私は、アプリケーションを終了する必要があり、その後、私は再びそれは私の他の機能の上及びこれによる

OK

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

上記の質問で報告されているようにあなたが同様の問題が表示される場合があります。
"updateSettings"にsqlite3_finalizeがありません。
"databaseConnection"をリリースするたびにDBをクローズしていますか?

2)
DBを100〜200回開いていますか?
もしそうなら、これがあなたのアプリケーションに最適なアプローチであるかどうかを考えなければならないかもしれません。

DBアクセスにシングルトンを使用することを考えましたか? - > init中に一度DBを開き、毎回接続を再利用してください。これは、あなたのアプリケーションをスピードアップするだけでなく、メモリ使用量を減らすこともできます。チェックアウト:
http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
あなたの決定では、あなたのアプリケーションで複数のスレッドが同時にDBにアクセスするかどうかを検討する必要があります。

ベスト、
ラルフ

関連する問題