4

私のアプリはCoreDataを使用しています。対応するsqliteファイルを正常に作成して入力したシミュレーターでアプリを実行しました。この既存のsqliteファイルを実際のデバイスに取り込み、アプリの一部にしたいと思います。シミュレーターで生成されたsqliteファイルを/Library/ApplicationSupport/iPhoneSimulator / 6.0 / Applications / identifier / Documents / myapp.sqliteに配置し、Xcodeにドラッグしました。これにより、アプリケーションバンドルに追加されましたが、適切なディレクトリには追加されていません(その結果、sqliteファイルの読み取りはできますが書き込みはできません)。

ファイルシステムについて読んだことから、sqliteファイルを配置するのに最適な場所は、Application_Home /Library/の下のカスタムディレクトリ「データベース」にあると思います。Xcode内でこれを行うことができないようで、検索したにもかかわらず、次の方法を理解できません。

(1)Application_Home / Library /に「Database」というサブディレクトリを作成しますか?(2)sqliteファイルを新しく作成した「データベース」ディレクトリに転送しますか?

以下の彼の答えの@Daij-Djanに感謝します。

もう1つの質問: sqliteファイルへのパスは永続ストアコーディネーターによって使用されます。sqliteファイルのサイズによっては、コピーまたは移動に時間がかかる場合があります。永続ストアコーディネーターがsqliteファイルを参照しようとする前に、@ Daij-Djanによって提供されたサンプルコードが実行され、終了したことをどのように確認できますか?

よろしくお願いします。

4

1 に答える 1

4

モックコード

アプリでDidFinishLaunching..多分

dbpath = PATH_YOU_WANT
if(!file.exists_at:dbpath) {
    copy(dbinbundle, dbpath);
}

in objC: (インラインで記述、タイプミス/ミスの可能性あり)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    NSString *lib = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *dbs = [lib stringByAppendingPathComponent:@"Database"];
    NSString *file = [dbs stringByAppendingPathComponent:@"db.sqlite"];
    if(![[NSFileManager defaultManager] fileExistsAtPath:file]) {

        id dbInBundle = [[NSBundle mainBundle] pathForResource:@"db" ofType:@"sqlite"];

        [[NSFileManager defaultManager] createDirectoryAtPath:dbs withIntermediateDirectories:YES attributes:nil error:nil];
        [[NSFileManager defaultManager] copyItemAtPath:dbInBundle toPath:file error:nil];
    }
    ....
}
于 2012-11-11T21:37:17.640 に答える