如何以编程方式将属性添加到现有Core Data实体(对象)?

时间:2013-03-25 21:26:39

标签: ios objective-c core-data nsentitydescription

我想在我的应用程序运行时期间以编程方式向属性添加属性。

这是你建议做的事情,还是会导致问题?

我如何合并NSAttributeDescriptionNSEntityDescription?我熟悉使用Xcode创建模型,但尚未使用NSEntityDescription创建模型。

5 个答案:

答案 0 :(得分:3)

这在理论上是可行的,但看起来并不实用。

您可以通过编程方式修改NSManagedObjectModel,以及NSEntityDescription。请注意,如果修改已实例化的模型,-setEntities:(NSManagedObjectModel)和-setProperties:(NSEntityDescription)都会触发异常。因此,您无法修改现有模型的结构。您必须创建一个新数据并根据新模型将所有数据从旧Core Data堆栈复制到新数据库。

使用NSMutableDictionary是一种更加理智的方法。

答案 1 :(得分:1)

我不会这样做。如果商店与您的模型不兼容,它将崩溃。这种风险真的值得你试图创造的好处吗?

我发现在前面创建更多(甚至更多)属性只是为了“安全起见”。未使用属性的开销非常小,但您可以灵活地“动态”向对象添加信息。

正如评论中所指出的,实现这一点的一个好方法是为属性使用单独的实体,并将它们作为多个关系添加。

答案 2 :(得分:1)

这是article非常详细地讨论这个问题。希望它有所帮助。

答案 3 :(得分:1)

我在这里使用了几乎相同的技术EPPZQueuedObject.h

虽然,我认为在运行时期间改变实体体系结构可能导致不兼容问题(实际上是一个例外),当存储的SQLite数据在启动时不适合您的初始实体时。

因此,这个通用对象EPPZQueuedObject完全是两个属性的对象,所以我无意仅为此目的使用单独的模型文件。但此结构在运行时不会发生变异

@implementation EPPZQueuedObject


@dynamic creationDate;
@dynamic archivedObject;


+(NSEntityDescription*)entityDescription
{
    //Describe EPPZQueuedObject.
    NSEntityDescription *entityDescription = [NSEntityDescription new];
    entityDescription.name = EPPZQueuedObjectEntityName;
    entityDescription.managedObjectClassName = NSStringFromClass(self);

    //Describe creationDate.
    NSAttributeDescription *creationDateDescription = [NSAttributeDescription new];
    creationDateDescription.name = @"creationDate";
    creationDateDescription.attributeType = NSDateAttributeType;
    creationDateDescription.attributeValueClassName = @"NSDate";
    creationDateDescription.defaultValue = nil;    

    //Describe archivedObject.    
    NSAttributeDescription *archivedObjectDescription = [NSAttributeDescription new];
    archivedObjectDescription.name = @"archivedObject";    
    archivedObjectDescription.attributeType = NSBinaryDataAttributeType;
    archivedObjectDescription.attributeValueClassName = @"NSData";
    archivedObjectDescription.defaultValue = nil;

    //Add attributes.
    entityDescription.properties = @[ creationDateDescription, archivedObjectDescription ];

    //Voila.
    return entityDescription;
}


@end

相应文章中的更多详细信息:http://eppz.eu/blog/simple-core-data-sample/

答案 4 :(得分:0)

我正在研究类似的事情,我正在考虑创建一个名为" Properties"的新核心数据类,因此我可以将我的核心数据对象设置为&#34 ;与许多物业的关系"。每个属性都有核心数据字符串类型属性:"属性","类型"和"价值"。

我认为应该提供足够的灵活性来动态地向核心数据对象添加属性。如果我碰巧实现了这个,我会在这里发布