2016-03-26 15 views
0

アプリケーションにsqliteファイルを追加し、バンドルからドキュメントディレクトリにコピーしようとしています。私はsqliteをターゲットアプリケーションに追加しました。バンドルからドキュメントディレクトリにコピーしようとしてエラーが発生しました

NSString *destination = [[[Utils applicationDocumentsDirectory] absoluteString] stringByAppendingString:@"myapp.sqlite"]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if (![fileManager fileExistsAtPath:destination]) { 
     NSString *source = [[NSBundle mainBundle] pathForResource:@"myapp" ofType:@"sqlite"]; 
     NSError *error = nil; 
     [fileManager copyItemAtPath:source toPath:destination error:&error]; 
     if (error) { 
      // 
     } 
    } 

コード[Utils applicationDocumentsDirectory]のため:私は、ファイルをコピーするために使用するコードを次に示し

エラードメイン:

+ (NSURL *)applicationDocumentsDirectory 
{ 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
} 

しかし、このコードが実行されるが、私は次のerrorを取得します= NSCocoaErrorDomain Code = 4 "ファイル" myapp.sqlite " は存在しません。 UserInfo = {NSSourceFilePathErrorKey =/Users/harikrishnant /ライブラリ/開発者/ CoreSimulator/Devices/8E531314-F1AE-417F-8E99-7AA92967CDC9/data /コンテナ/バンドル/アプリケーション/ 0A710929-475D-457C-8D2D-C2F2BBEB6B92/myapp.app /Myapp.sqlite、 NSUserStringVariant =( コピー)、NSDestinationFilePath = file:///ユーザー/ harikrishnant /ライブラリ/ Developer/CoreSimulator/Devices/8E531314-F1AE-417F-8E99-7AA92967CDC9/data/Containers/Data/Application/13B22E15-D00C-433C-9F02-014B1F73D183/Documents/myapp.sqlite、 NSFilePath =/Users/harikrishnant /ライブラリ/開発者/ CoreSimulator/Devices/8E531314-F1AE-417F-8E99-7AA92967CDC9/data/Containers/Bundle/Application/0A710929-475D-457C-8D2D-C2F2BBEB6B92/myapp.app/myapp.sqlite、 NSUnderlyingError = 0x7faffe1b5cf0 {エラードメイン= NSPOSIXErrorDomain コード= 2 "No such file or directory"}}

私は、端末を使用して次のパスをチェックし、sqliteのファイルが実際にアプリケーションバンドルに存在することを考え出し:

/ユーザ/ harikrishnant /ライブラリ/開発/ CoreSimulator /デバイス/ 8E531314-F1AE- 417F-8E99-7AA92967CDC9 /データ/コンテナ/バンドル/アプリケーション/ 0A710929-475D-457C-8D2D-C2F2BBEB6B92/myapp.app/myapp.sqlite

しかし、それでもまだ、私はこのエラーを取得しています。私はすべてを試みた。私もビルドフォルダをきれいにして、アプリケーションを再インストールしても、それはまだ動作しませんでした。何が問題なの?どのようにそれを解決するには?

+0

あなたの質問に 'UtilsのapplicationDocumentsDirectory'のためのコードを更新します。 – rmaddy

+0

@rmaddyコードを追加しました。 –

+1

ドキュメントのURLを取得するコードが正しいです。しかし、 'NSURL'をパス文字列に変換するには' path'と 'absoluteString'を呼ぶことをお勧めします。 – rmaddy

答えて

2

あなたのコードはほぼ正しいです。この行には2つの欠陥があります。

NSString *destination = [[[Utils applicationDocumentsDirectory] absoluteString] stringByAppendingString:@"myapp.sqlite"]; 

absoluteStringの使用は間違っています。これにより、ファイルURLはfile://path/to/Documents/の形式で与えられます。ファイルを使用して、NSURLからファイルパス(ファイルURLではない)を取得する必要があります。

次に、パスにファイル名を正しく追加する必要があります。 stringByAppendingString:の代わりにstringByAppendingPathComponent:を使用する必要があります。

その行は次のようになります。

NSString *destination = [[[Utils applicationDocumentsDirectory] path] stringByAppendingPathComponent:@"myapp.sqlite"]; 
+0

これはうまくいった!ありがとう!!! –

0

私はSQLite DBをアプリケーションバンドルからドキュメントディレクトリにコピーするためにコードを使用しています。
「データベース」はフォルダ名です。 「データソース」は、私のデータベース名であり、それは延長の「DB」

-(void)saveDatabase{ 
     //put bundle database to DocumentDirectory 
     NSLog(@"%@",[self databasePath]); 
     //Create Path For Destination 
     NSString* path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 
     path = [path stringByAppendingPathComponent:@"Database"]; 
     BOOL isExists=[[NSFileManager defaultManager]fileExistsAtPath:path]; 
     if(!isExists){ 
      NSError* error; 
      BOOL isCreated = [[NSFileManager defaultManager]createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:&error]; 
      if(isCreated){ 
       path = [path stringByAppendingPathComponent:@"Datasource"]; 
       path = [path stringByAppendingPathExtension:@"db"]; 
       isExists = [[NSFileManager defaultManager]fileExistsAtPath:path]; 
       if(!isExists){ 
        NSError* dbError; 
        NSString* bundle = [[NSBundle mainBundle]pathForResource:@"Datasource" ofType:@"db"]; 
        isCreated = [[NSFileManager defaultManager]copyItemAtPath:bundle toPath:path error:&dbError]; 
        if(isCreated){ 
         NSLog(@"DatabasePath %@",path); 
        }else{ 
         NSLog(@"ErrorCopying DB file %@",dbError.localizedDescription); 
        } 
       }else{ 

       } 

      }else{ 
       NSLog(@"Error While Creating Database Directory:->%@",error.localizedDescription); 
      } 
     } 
    } 
    - (NSString*)databasePath{ 
     NSString* path = [self documentDirectory]; 
     path = [path stringByAppendingPathComponent:@"Database"]; 
     path = [path stringByAppendingPathComponent:@"Datasource"]; 
     path = [path stringByAppendingPathExtension:@"db"]; 
     return path; 
    } 
    - (NSString*)documentDirectory{ 
     return [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 
    } 
+0

申し訳ありませんが、これは実際に働いていたいくつかの試みの後に! –

+0

いいえ、このコードを使用しないでください。これは、ドキュメントフォルダへの参照を取得する適切な方法ではありません。さらに、このコードのロジックは非常に悪く、正しく動作しません。 – rmaddy

+0

@rmaddy私は本当にロジックに従っていませんでしたが、パスを取得するコードは実際に私の問題を解決するのに役立ちました。 –

0

であるあなたのファイルは、使用目的にBuild Phases -> Copy Bundle Resourcesに記載されていることを確認します。 Derived dataを削除してみてください。それでも動作しない場合は、Derived dataに行き、Finderを使用してファイルを確認してください。

関連する問題