7

CodeDataオブジェクトモデルに新しい属性を追加するたびに、データベースファイルをクリアする必要があります。そうしないと、次のエラーが発生します。

2010-11-13 15:26:44.580 MyApp [67066:207] *キャッチされなかった例外「NSInternalInconsistencyException」が原因でアプリを終了しています。理由:「+ entityForName:エンティティ名「myApp」のNSManagedObjectModelが見つかりませんでした。

データベース全体を失うことなく、フィールドを追加できる方法が必要です。

データを保持するには何をする必要がありますか?

4

2 に答える 2

14

方法があり、この方法は自動軽量移行と呼ばれます。オブジェクトモデルを変更するときは、コード変更と追加の手順が必要です。

コードの場合、永続ストアコーディネーターを初期化するメソッドに2つのオプションを追加する必要があります。このようなもの:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (persistentStoreCoordinator_ != nil) {
        return persistentStoreCoordinator_;
    }
    NSString *storePath = [AppDelegate_Shared coredataDatabasePath];
    NSURL *storeURL = [NSURL fileURLWithPath:storePath];

// important part starts here
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
                             nil];
    NSError *error = nil;
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
// and ends here

        LogError(@"Unresolved error %@, %@", error, [error userInfo]);
        // Do something 
    }    
    return persistentStoreCoordinator_;
}

モデルを変更する場合は、変更を行う前にモデルバージョンを作成する必要があります。
データモデルを選択し、メインメニューに移動しますDesign -> Data Model -> Add Model Version。「古い」モデルの名前が変更され、現在のモデル(緑色のマークが付いているモデル)に変更を加えます。
古いモデルはすべて保持され、アプリケーションに組み込まれるため、アプリは「自動軽量移行」を実行し、既存のデータベースを新しいモデルにアップグレードできます。

于 2010-11-13T21:50:08.863 に答える
1

@MatthiasBauchの回答に加えて

Xcode12.3の場合

メインメニューから選択Editor -> Add Model Version

ここに画像の説明を入力してください

追加するには、新しいモデルを現在のモデルとして緑色のチェックマークでマークします。次の画像に従ってください

ここに画像の説明を入力してください

于 2021-01-26T05:24:53.870 に答える