2010-12-02 30 views
1

データベースとの接続を開くと、コンソールに「error opening !: 14」と表示されます。 "mybase.sqlite"をプロジェクトのResourcesフォルダに含めました。私はFMDBフレームワークを使用しています。オープンのためにFMDBとデータベースのオープン接続でエラーが発生しました

が、私はこのコードを使用しています接続:AppDelegateで

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
    FMDatabase* db = [FMDatabase databaseWithPath:@"/mybase.sqlite"]; 
    if (![db open]) { 
     NSLog(@"Não abriu o banco de dados."); 
     [pool release]; 
     return 0; 
    } 

を、私はこのコードが含まれていました。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary 
*)launchOptions {  

    // Override point for customization after application launch. HomeViewController *homeVC = [[HomeViewController alloc] init]; navigationController = [[UINavigationController alloc] initWithRootViewController:homeVC]; [self createEditableCopyOfDatabaseIfNeeded]; [window addSubview:navigationController.view]; 
    [window makeKeyAndVisible]; 
    return YES; } 

- (void)createEditableCopyOfDatabaseIfNeeded{ BOOL success; NSFileManager 
*fileManager = [NSFileManager defaultManager]; NSError *error; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString 
*documentsDirectory = [paths objectAtIndex:0]; NSString 
*writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"mybase.sqlite"]; success = [fileManager fileExistsAtPath:writableDBPath]; NSLog(@"Success %d", success); if (success) return; NSString 
*defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"mybase.sqlite"]; success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; if (!success) { NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); } } 
+3

ルーカスあなたの質問に答えたので、あなたはその答えに合格とマークする必要があります。 –

+1

@LucasMoreriaこれはまだ受け入れられませんでしたか?それは完璧な答えです。 – MackieeE

+0

@ slycrelの答えは完璧で、動作しています。あなたは答えを受け入れたものとしてマークするべきです。 –

答えて

13

私はあなたのオープンパスが正しくない可能性があると思います。あなたのDBファイルがルートフォルダにあるかのように、意味を成さないパスを指定しています。

FMDatabase* db = [FMDatabase databaseWithPath:@"/mybase.sqlite"]; 

上記のコードは、既にこの質問に記載されているファイルパスに使用する必要があります。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"mybase.sqlite"]; 
FMDatabase* db = [FMDatabase databaseWithPath:writableDBPath]; 
+1

それは動作しますが、最初の行が正しくありません。これは次のような作業です。 \t NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory、NSUserDomainMask、YES); –

+0

doh、オリジナルの記述から私の部分にコピー・ペースト・エラーを出します。ありがとう! – slycrel

関連する問題