我想在我的应用程序运行时期间以编程方式向属性添加属性。
这是你建议做的事情,还是会导致问题?
我如何合并NSAttributeDescription
和NSEntityDescription
?我熟悉使用Xcode创建模型,但尚未使用NSEntityDescription
创建模型。
答案 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 ;与许多物业的关系"。每个属性都有核心数据字符串类型属性:"属性","类型"和"价值"。
我认为应该提供足够的灵活性来动态地向核心数据对象添加属性。如果我碰巧实现了这个,我会在这里发布