Ios 如何以编程方式向现有核心数据实体(对象)添加属性?
我想在我的应用程序运行时以编程方式向实体添加属性 这是你建议做的事情还是会导致问题Ios 如何以编程方式向现有核心数据实体(对象)添加属性?,ios,objective-c,core-data,nsentitydescription,Ios,Objective C,Core Data,Nsentitydescription,我想在我的应用程序运行时以编程方式向实体添加属性 这是你建议做的事情还是会导致问题 我需要如何组合NSAttributeDescription和NSEntityDescription?我熟悉使用Xcode创建模型,但还没有使用nEntityDescription来创建模型。这在理论上是可能的,但似乎不太实用 您可以通过编程方式修改NSManagedObjectModel,也可以修改NSEntityDescription。请注意,如果修改已实例化的模型,则-setEntities:(NSManag
我需要如何组合
NSAttributeDescription
和NSEntityDescription
?我熟悉使用Xcode创建模型,但还没有使用nEntityDescription
来创建模型。这在理论上是可能的,但似乎不太实用
您可以通过编程方式修改NSManagedObjectModel
,也可以修改NSEntityDescription
。请注意,如果修改已实例化的模型,则-setEntities:
(NSManagedObjectModel)和-setProperties:
(NSEntityDescription)都会触发异常。因此,无法修改现有模型的结构。您必须创建一个新的核心数据堆栈,并根据新模型将旧核心数据堆栈中的所有数据复制到新的核心数据堆栈中
使用NSMutableDictionary是一种更明智的方法。这在理论上是可能的,但似乎不太实际 您可以通过编程方式修改
NSManagedObjectModel
,也可以修改NSEntityDescription
。请注意,如果修改已实例化的模型,则-setEntities:
(NSManagedObjectModel)和-setProperties:
(NSEntityDescription)都会触发异常。因此,无法修改现有模型的结构。您必须创建一个新的核心数据堆栈,并根据新模型将旧核心数据堆栈中的所有数据复制到新的核心数据堆栈中
使用NSMutableDictionary是一种更明智的方法。我不会这样做。如果商店与您的模型不兼容,它将崩溃。这种风险真的值得你努力创造的利益吗 我发现,为了“安全起见”,预先创建更多(甚至更多)属性是有意义的。未使用属性的开销实际上是最小的,但是您可以灵活地“动态”地向对象添加信息
正如评论中所指出的,实现这一点的一个好方法是为属性使用单独的实体,并将它们添加到许多关系中。我不会这样做。如果商店与您的模型不兼容,它将崩溃。这种风险真的值得你努力创造的利益吗 我发现,为了“安全起见”,预先创建更多(甚至更多)属性是有意义的。未使用属性的开销实际上是最小的,但是您可以灵活地“动态”地向对象添加信息
正如评论中所指出的,一个很好的实现方法是为属性使用单独的实体,并将它们添加到许多关系中。这是一个非常详细的讨论。希望能有所帮助。这是一个非常详细的讨论。希望有帮助。我刚才在这里使用了几乎相同的技巧: 尽管如此,我认为在运行时改变实体架构可能会导致不兼容问题(实际上是一个例外),因为存储的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
相关文章中有更多详细信息:我刚才在这里使用了几乎相同的技术: 尽管如此,我认为在运行时改变实体架构可能会导致不兼容问题(实际上是一个例外),因为存储的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
相关文章中有更多详细信息:我正在研究类似的东西,我正在考虑创建一个名为“属性”的新核心数据类,这样我就可以将我的核心数据对象设置为具有“与许多属性的关系”。每个属性都有核心数据字符串类型属性:“属性”、“类型”和“值”
我认为这应该提供足够的灵活性,以便在运行中向核心数据对象添加属性。如果我碰巧实现了这一点,我将把它发布在这里我正在研究类似的东西,我正在考虑创建一个名为“属性”的新核心数据类,这样我就可以将我的核心数据对象设置为具有“与多个属性的关系”。每个属性都有核心数据字符串类型属性:“属性”、“类型”和“值”
我认为这应该提供足够的灵活性,以便在运行中向核心数据对象添加属性。如果我碰巧实现了这一点,我将在这里发布它这是一个有趣的请求。你有没有考虑过为你的对象建立一个可变字典呢?Rey,我不知道这是否行得通。我有一个大的时间序列样本(作为日期和值类型a存储在核心数据中),我想在其中添加额外的值类型b和c.Hm。如果我是你,我会向我的实体添加一个可转换的数据类型,扩展NSMutableDictionary,使一个键(日期)具有多个值,然后将我的值存储在其中。这听起来很有趣,Rey!我将对此进行彻底调查。但是,我不能像使用标准属性那样轻松地执行基于数据库的计算。如果您只是想扩展现有的模型/对象图,这听起来像是一个新模型版本和轻量级模型迁移的例子。您可以添加新属性,核心数据将为您更新数据存储。然后可以通过编程方式更新值b和c。这是一个有趣的请求。你考虑过哈维吗