【Xcode】Supporting Files内のファイルをdocumentsディレクトリにコピーする

Supporting Files内のファイルをdocumentsディレクトリにコピーしたときのスクリプト。
初回起動時に実行したかったので、スクリプトは、AppDelegate.m 内の didFinishLaunchingWithOptions: に記述した。

--------------------------------------------------------------------
//didFinishLaunchingWithOptions は、アプリ起動時に呼び出される。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

//呼び出したいメソッドで下記を実行

NSError *error;

//NSFileManagerクラスは、Foundation フレームワーク(Cocoa Touchフレームワーク)にあるクラス。
//Objective-C で、パスの存在を調べたり、ディレクトリを作成したりするのに使う。

NSFileManager *fm = [NSFileManager defaultManager];

//documentsディレクトリのパス

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"コピーしたいファイル.jpg"];
NSLog(@"writableDBPath;%@",writableDBPath);


/*
//常に新しいDBファイルにしたい場合は、アプリ起動時に必ずファイルを消去する。
/* pathのファイルを削除 */
BOOL result = [fm removeItemAtPath:writableDBPath error:&error];
if (result) {
NSLog(@"ファイルを削除に成功:%@", writableDBPath);
} else {
NSLog(@"ファイルの削除に失敗:%@", error.description);
}
*/

BOOL result_flag = [fm fileExistsAtPath:writableDBPath];
if(!result_flag){

//dbが存在してなかったらここが呼ばれて、作成したDBをコピー

//Supporting Files内に置いたファイルのパス
//ここで null が帰ってきたりうまくコピーができなかったら、ファイルのコピーを許可していない可能性がある。許可の仕方はスクリプトのすぐ下に記述。

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"コピーしたいファイル.jpg"];

//こっちの記述でもいい

//NSString *defaultDBPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"db"];

//コピーを実行

BOOL copy_result_flag = [fm copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if(!copy_result_flag){

//失敗したらここ

NSLog(@"コピーに失敗");
}
}

return YES;
}
--------------------------------------------------------------------

コピーするファイルは、あらかじめ許可しておく必要があるので、うまくコピーできない場合は許可されているか確認する。

targets > BuildPhase > Copy Bundle Resources
から適宜該当ファイルを追加すれば解消される。参考

//FMDB使っていて、データファイルをコピーしたときのスクリプトがこれ↓ 参考
--------------------------------------------------------------------
NSError *error;
NSFileManager *fm = [NSFileManager defaultManager];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"test.db"];
NSLog(@"writableDBPath;%@",writableDBPath);

BOOL result_flag = [fm fileExistsAtPath:writableDBPath];
if(!result_flag){
//dbが存在してなかったらここが呼ばれて、作成したDBをコピー
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"test.db"];

BOOL copy_result_flag = [fm copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if(!copy_result_flag){
//失敗したらここ
NSLog(@"データベースのコピーに失敗");
}
}

//作成したテーブルからデータを取得
FMDatabase* db = [FMDatabase databaseWithPath:writableDBPath];
if ([db open]) {
[db setShouldCacheStatements:YES];

FMResultSet *rs = [db executeQuery:@"SELECT * FROM testdb"];
while ([rs next]) {
//ここでデータを展開
NSLog(@"データ展開%d %@", [rs intForColumn:@"id"], [rs stringForColumn:@"title"]);
}
[rs close];
[db close];
}else{
//DBが開けなかったらここ
}
--------------------------------------------------------------------