我想在我的应用程序运行时以编程方式将属性添加到实体。
这是您建议做的事情还是会导致问题?
我需要如何结合NSAttributeDescription
和NSEntityDescription
?我熟悉使用 Xcode 创建模型,但还没有使用它NSEntityDescription
。
我想在我的应用程序运行时以编程方式将属性添加到实体。
这是您建议做的事情还是会导致问题?
我需要如何结合NSAttributeDescription
和NSEntityDescription
?我熟悉使用 Xcode 创建模型,但还没有使用它NSEntityDescription
。
理论上是可行的,但似乎不太实用。
您可以以NSManagedObjectModel
编程方式修改NSEntityDescription
. 请注意,如果您修改已实例化的模型,则-setEntities:
(NSManagedObjectModel) 和(NSEntityDescription) 都会触发异常。-setProperties:
所以你不能修改现有模型的结构。您必须创建一个新的,并将所有数据从旧的 Core Data 堆栈复制到基于您的新模型的新堆栈中。
使用 NSMutableDictionary 是一种更明智的方法。
这是一篇非常详细地讨论这个问题的文章。希望能帮助到你。
我在这里使用了几乎相同的技术: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/
我不会这样做。如果商店与您的模型不兼容,它将崩溃。这种风险真的值得你试图创造的好处吗?
我发现预先创建更多(甚至更多)属性只是“为了安全起见”是有意义的。未使用属性的开销确实很小,但您可以灵活地“即时”轻松地向对象添加信息。
正如评论中所指出的,实现该功能的一种好方法是使用单独的实体作为属性并将它们添加为多对多关系。
我正在研究类似的东西,并且正在考虑创建一个名为“Properties”的新核心数据类,因此我可以将核心数据对象设置为“与许多属性有关系”。每个属性都将具有核心数据字符串类型属性:“属性”、“类型”和“值”。
我认为这应该提供足够的灵活性来即时向核心数据对象添加属性。如果我碰巧实现了这个,我会在这里发布