4

Core Dataモデルにいくつかの変更を加え、ここで説明されているように移行を処理しています:軽量移行

それは問題ではありません。ただし、現在のモデルのバージョンを条件として、データにいくつかの更新を加えたいと考えています。現在のモデル バージョンの名前を取得するにはどうすればよいですか? 私は次のようなものを見ると思っていました:

[[NSBundle mainBundle] currentDataModelName]

しかし、私はそれを見つけることができないようです。誰でも助けることができますか?

4

2 に答える 2

6

モデル名を取得して、モデル識別子の代わりに使用できます。この優れた記事Custom Core Data Migrationsと対応するGithub コードを確認してください。NSManagedObjectModel+MHWAdditions カテゴリの助けを借りて、モデル名を取得できます。


ソース モデル名:

NSError *error;
NSString *storeType = ...;
NSURL *storeURL = ...;
NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator  metadataForPersistentStoreOfType:storeType
                                                                                           URL:storeURL
                                                                                         error:&error];
NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergedModelFromBundles:@[[NSBundle mainBundle]]
                                                                forStoreMetadata:sourceMetadata];
NSString *sourceModelName = [sourceModel mhw_modelName];


宛先モデル名:

NSString *destinationModelName = [[self managedObjectModel] mhw_modelName];

managedModelObjectゲッターを実装したと仮定します。そうでない場合は、すぐに使える実装を次に示します。

- (NSManagedObjectModel *)managedObjectModel {
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }

    NSString *momPath = [[NSBundle mainBundle] pathForResource:@"YourModel" ofType:@"momd"];

    if (!momPath) {
        momPath = [[NSBundle mainBundle] pathForResource:@"YourModel" ofType:@"mom"];
    }

    NSURL *url = [NSURL fileURLWithPath:momPath];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];
    return _managedObjectModel;
}


移行する場合、移行元のモデル名と移行先のモデル名が異なります。それ以外の場合、名前は同じになります。

于 2015-05-10T07:02:34.660 に答える
4

NSManagedObjectModel受信者に送信することで質問できますversionIdentifiers

- (NSSet *)versionIdentifiers

ドキュメントはこちら

于 2013-01-17T23:40:13.360 に答える