获取当前核心数据模型的名称

Amp*_*4nd 4 core-data ios

我已经对Core Data模型进行了一些更改,并且我们正在按如下所述处理迁移:轻量级迁移

那不是问题。但是,我想对数据进行其他一些更新,这些更新取决于当前模型版本。如何获得当前模型版本的名称?我希望看到类似的东西:

[[NSBundle mainBundle] currentDataModelName]
Run Code Online (Sandbox Code Playgroud)

但我似乎找不到。有人可以帮忙吗?

mrv*_*nzo 5

您可以获取模型名称并使用它代替模型标识符。查阅这篇出色的文章“ 自定义核心数据迁移”和相应的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];
Run Code Online (Sandbox Code Playgroud)


目标型号名称:

NSString *destinationModelName = [[self managedObjectModel] mhw_modelName];
Run Code Online (Sandbox Code Playgroud)

假设您实现了一个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;
}
Run Code Online (Sandbox Code Playgroud)


迁移时,源模型名称和目标模型名称将有所不同。否则,名称将相同。


SAE*_*SAE 4

您可以NSManagedObjectModel通过发送versionIdentifiers给接收者来询问。

- (NSSet *)versionIdentifiers
Run Code Online (Sandbox Code Playgroud)

文档在这里

  • 这是可行的,但值得注意的是,版本标识符默认为空,如下所示:http://stackoverflow.com/questions/3895156/nsmanagementobjectmodel-versionidentifiers 和文档中,以便确定模型是否已更改,我必须手动设置 objectModel 的 versionIdentifiers,然后将其与存储在其他地方的值(例如 NSUserDefaults)进行比较。 (2认同)