2011-01-20 14 views
10

iPhoneの開発を始めたばかりです。私がタブバコントローラのテーブルビューにsqlite dbに格納されたデータを表示しなければならない例の1つでは、sqliteファイルをアプリケーションバンドルからドキュメントフォルダに移動しなければなりませんでした。iPhone:ファイルからリソースにファイルをコピーする方法は?

Iは、アプリケーションテンプレート使用 - 、XCodeの(最新のiOS = 4.2に設定し、ベースSDK)によって生成されたテンプレートで

(記憶のためにコアデータを使用し)iPhone用のiOS>アプリケーション>ウィンドウベースのアプリケーションを、以下のコードはドキュメントフォルダのパスを取得しようとしているではあり...

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

だった、私はこのような上に与えられた方法を使用...

NSString *documentDirectory = [self applicationDocumentsDirectory]; 

これはwarniを与えましたNG - warning: incompatible Objective-C types initializing 'struct NSURL *', expected 'struct NSString *'

だから私は...次へ

// Added the message absoluteString over here 
NSString *documentDirectory = [[self applicationDocumentsDirectory] absoluteString]; 

NSString *writableDBPath = [documentDirectory stringByAppendingPathComponent:@"mydb.sqlite"]; 
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"mydb.sqlite"]; 
BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
if (!success) { 
    NSLog(@"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
} 

とブームを、コードを変更! - 'Failed to create writable database file with message 'The operation couldn’t be completed. No such file or directory'.'

XCodeテンプレートで生成されたapplicationDocumentsDirectoryというメソッドが私のために動作しないため、ドキュメントディレクトリへのパスをどのように見つけるべきですか?

また、誰かが上に与えたapplicationDocumentsDirectoryの目的のためにいくつかの光を投げることができます。

おかげ

+0

私はwritableDBPath上のファイル名を追加していなかったので、私はエラーを取得しました。この例は、私がそれを修正するのを助けました。ありがとう! +1 – voghDev

答えて

5

私はちょうど自分自身は数日前にこのに走りました。物事をパスパスの下に強制したり、NSURLパスを使用したりしないでください。それらを使用する方法を取得するには、時間がかかりません。

このメソッドについては、アプリケーションの標準化されたドキュメントディレクトリへのURLをシステムに要求するだけです。これを使用し、新しいファイルを置く場所に関するほとんどすべてが正しいでしょう。

+0

これ以上の詳細はどうですか? : –

20

HERESにそれを行うための簡単な方法:

NSFileManager *fmngr = [[NSFileManager alloc] init]; 
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"mydb.sqlite" ofType:nil]; 
    NSError *error; 
    if(![fmngr copyItemAtPath:filePath toPath:[NSString stringWithFormat:@"%@/Documents/mydb.sqlite", NSHomeDirectory()] error:&error]) { 
     // handle the error 
     NSLog(@"Error creating the database: %@", [error description]); 

    } 
    [fmngr release]; 
+2

現在のドキュメントからは、 "これは常にファイルマネージャの同じインスタンスを返します。返されるオブジェクトはスレッドセーフではありません。 Mac OS X v 10.5および後で[[NSFileManager alloc] init]をシングルトンメソッドのdefaultManagerではなく使用することを検討してください。代わりに[[NSFileManager alloc] init]を使用すると、結果として生じるNSFileManagerインスタンスはスレッドセーフです。 " –

+0

だから、最初の行のRHSを[[NSFileManager alloc] init]に変更し、ifブロックの後ろに[fmngr release]を追加します。 –

+0

これを指摘してくれてありがとうございます。出てきましたが、私は頭の後ろにそれを詰め込んで、他のすべてのアップデートについて学んでいると思います。 – Rich

関連する問題