您如何获得一个新的核心数据实体属性以反映在该实体的 NSManagedObject 中?

Posted

技术标签:

【中文标题】您如何获得一个新的核心数据实体属性以反映在该实体的 NSManagedObject 中?【英文标题】:How do you get a new Core Data Entity attribute to be reflected in the NSManagedObject for that Entity? 【发布时间】:2012-02-28 20:50:05 【问题描述】:

我正在尝试在我的一个 db 类上实现一个 getter。但是当我执行以下代码行时,其中“obj”是一个 NSManagedObject:

return [obj valueForKey:@"activationData"];

我得到以下 NSUnknownKeyException:

'[valueForUndefinedKey:]:实体蓝图不符合键“activationData”的键值编码。'

我最近使用 Xcode 向我的“蓝图”实体添加了一个名为“activationData”的字符串属性。但是当我运行应用程序时,代表蓝图实体的 NSManagedObject 不包含新的“activationData”属性,这显然是导致崩溃的原因。

NSManagedObject 看起来像这样,但我希望它显示新属性以及 createDate、name 和 order 属性:

<NSManagedObject: 0x5138c90> (entity: Blueprint; id: 0x513a2e0 <x-coredata://8C586BB8-B9E7-4FD7-84CB-5CE66FB221E6/Blueprint/p2> ; data: 
    createDate = "2012-02-21 15:49:00 +0000";
    name = "Feb 17 test";
    order = 2;
)

仅供参考,user1226119 的回答(如下)提醒我,我使用 Organizer 从我的设备中提取 sqlite db 并使用 SQLite Manager 检查它以验证事情。果然蓝图表中仍然没有新的activationData 字段。表格看起来和往常一样。

我想我一定错过了向现有数据库实体添加新属性的一些必要步骤。

【问题讨论】:

【参考方案1】:

您的模型在您的应用中没有改变。您必须删除旧的应用程序并在您的设备上重新部署您的应用程序。

【讨论】:

我已经试过了。应该在我的问题中提到它。【参考方案2】:

解决方案是在返回 NSManagedObjectModel 的代码中更新 pathForResource 方法调用。在添加属性之前,我确实创建了数据库的新 xcdatamodel 版本,但显然您应该使用以下代码引用它,该代码检索您的应用将使用的模型。

- (NSManagedObjectModel *)managedObjectModel 

    if (managedObjectModel != nil) 
        return managedObjectModel;
    

    NSString *path = [[NSBundle mainBundle] pathForResource:@"MyDB Version5" ofType:@"mom" inDirectory:@"ASSIST.momd"];
    NSURL *momURL = [NSURL fileURLWithPath:path];
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];   

    return managedObjectModel;

我必须将新数据库版本的名称(“MyDB Version5”)作为 pathForResource 参数。以前是“MyDB Version5”。

【讨论】:

以上是关于您如何获得一个新的核心数据实体属性以反映在该实体的 NSManagedObject 中?的主要内容,如果未能解决你的问题,请参考以下文章

您如何创建一组与具有特定属性的其他实体有关系的实体?在核心数据中

重命名核心数据实体而不丢失数据

以核心数据实体作为属性的子类 UITextField

我应该如何对我的核心数据实体中的 NSNumber 属性执行计算/更新?

如何根据查找具有特定值的实体在我的核心数据之间进行迭代

两个日期之间实体属性的核心数据总和