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

5
我已经对我的 Core Data 模型进行了一些更改,我们正在按照此处所述的方式处理迁移: 轻量级迁移
这不是问题。然而,我想对我的数据进行另外几个更新,这取决于当前模型版本。我该如何获取当前模型版本的名称?我期望看到类似以下内容:
[[NSBundle mainBundle] currentDataModelName]

但是我似乎找不到它。有人能帮忙吗?

2个回答

7
您可以获取模型名称并使用它代替模型标识符。请查看这篇优秀的文章《自定义Core Data迁移》以及相应的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 的 getter 方法。如果没有,以下是一个开箱即用的实现。
- (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;
}


在迁移过程中,源模型名称和目标模型名称将不同。否则,这两个名称将相同。


4
你可以通过向接收方发送versionIdentifiers来查询你的NSManagedObjectModel
- (NSSet *)versionIdentifiers

这份文档可以在这里找到。


2
这个是可行的,但值得注意的是版本标识符默认为空,如此记录在这里:http://stackoverflow.com/questions/3895156/nsmanagedobjectmodel-versionidentifiers 以及文档中,因此为了确定是否更改了模型,我必须手动设置objectModel的versionIdentifiers,然后将其与其他地方存储的值(例如NSUserDefaults)进行比较。 - Ampers4nd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接