2011-01-19 12 views
3

のiPhoneアプリの寛容を作ること。私はエンティティにいくつかのフィールドを追加する更新版を開発しています。スキーマが変更されたため、ロード時に私のアプリケーションがクラッシュします(プライベートストレージを吹き飛ばしてから再開しない限り)。私は広範囲にCoreDataのAPIを使用するアプリケーションを持っているかCoreDataスキーマの変更

問題は、顧客が新しいバージョンにアップグレードするとき、私は初めてに自分のデータでアプリの負荷をアップグレード手順を実行している気にしないだろうが、CoreDataは好きではないので、私もそれをロードするために取得することはできませんスキーマが変更されます。

は一種の「その[OK]を..スキーマの変更を心配しないでください」CoreDataを指示する方法はありますか?フィールドを追加しただけで、名前を変更したり削除したりしていないためです。

答えて

6

あなたはおそらく(Chの。5)マーカスZarraのコアデータブックのコピーを取得し、移行上に読んでください。しかし、それに失敗すると、知っておくべきいくつかの基本があります。まず、更新されたアプリに古いモデル(スキーマ)と新しいモデルの両方が必要です。次に、新しいモデルが「現在のモデル」としてタグ付けされていることを確認する必要があります。第3に、NSPersistentStoreCoordinatorを、既存のモデル(ディスクからロードされたもの)から新しいモデルに自動的にマッピングするように作成する必要があります。あなたの新しいアプリで

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
    { 
    if (persistentStoreCoordinator) 
     return persistentStoreCoordinator; 

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyDataStore.sqlite"]]; 

    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 

    // Use mapping model 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil]; 


    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
           configuration:nil 
           URL:storeUrl 
           options:options 
           error:&error]) 
     { 
     [NSApp presentError:error]; 
     } 
    return persistentStoreCoordinator; 
    } 

更新 あなたの古いモデルでは、正確古いアプリでモデルと同じである必要があります。このようなことがわからない場合は、確認するために実行できる手順がいくつかあります。私がやっているやり方は少し関係していますが、それが役に立つと思ったら、私はそれを概説します。

+0

だから私はエンティティに追加したフィールドは、全く新しいエンティティである必要がありますか?それから、起動時にアップグレードをチェックして、古いスキーマから新しいスキーマに移行することができますか? –

+1

あなたはおそらくこれを読んでてきましたが、そうでないかもしれないを選択します。モデルをまったく変更しない場合は、新しいバージョンを作成してください。新しい属性を追加するだけであれば、既存の属性をオプションに/から変更することができます。軽量な移行は自由に行う必要があります。私は、あなたが「まったく新しいエンティティ」とは何を意味するのか分かりません。 – westsider

+0

私は軽量です。 –

関連する問題