0

最初の起動時にアプリに CoreData を事前設定するために、Web サービスからダウンロードしたデータ (画像を含む) からアプリによって以前に作成された PreModel.sqlite ファイルを含めました。

モデルを作成するには、次のようにします。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{    
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    NSLog(@"creating new store");

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"PreModel.sqlite"];

    if(![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {

        NSString *sqlitePath = [[NSBundle mainBundle] pathForResource:@"PreModel" ofType:@"sqlite"];
        if (sqlitePath) {
            NSError *error = nil;
            [[NSFileManager defaultManager] copyItemAtPath:sqlitePath toPath:[storeURL path] error:&error];
            if (error) {
                NSLog(@"Error copying sqlite database: %@", [error localizedDescription]);
            }
        }
    }     

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }   

    return _persistentStoreCoordinator;
}

うまくいくようです。しかし、私は2つの質問があります:

  1. sqlite ファイルが単なるデータベース ファイルであり、実際には画像が含まれていない場合、アプリは最初の起動時にどのように画像を見つけて読み込むのでしょうか?
  2. その後のアプリの実行でも、毎回「新しいストアの作成」がログに記録されます。なぜ_persistentStoreCoordinator常に nil なのですか? コードで明確に設定しています。
4

1 に答える 1

0
  1. 画像をデータベース ファイルに保存することができます。通常は、バイナリ BLOB (Core Data の NSData のインスタンスのように見えます) として保存できます。モデルまたは画像を保存/ロードするコードに関する詳細情報を提供できる場合は、より具体的にすることができます。
  2. このインスタンスでアプリが起動されるたびに、「新しいストアの作成」がログに記録されることが期待されます。SQLite ファイルはディスク上で永続的ですが、アプリが終了したときにコード内のデータ構造が残ることは期待できません。プログラムを起動するたびに、プログラム用の新しい永続ストア オブジェクトを作成する必要があります。

    を割り当てるようなものだと考えてください。その後、値 10NSInteger x = 10を維持しながら、プログラムを終了して再起動できることを期待しています。これはプログラムの動作ではありません。10を読み取って取得する前に、再割り当てする必要があります。変数はここでも同じように機能します。xx = 10x_persistentStoreCoordinator

于 2012-09-07T17:08:32.930 に答える