iPhone-更改实体类(NSManagedObject)使其可初始化

iPhone-更改实体类(NSManagedObject)使其可初始化,iphone,objective-c,core-data,nsmanagedobject,Iphone,Objective C,Core Data,Nsmanagedobject,我希望像普通对象一样使用自定义NSManagedObject及其常规函数。是否可以修改类,以便能够像普通对象一样初始化它 [[myManagedObject alloc] init]; 谢谢 编辑:为了澄清这个问题,如果我在实现中将@dynamic与@synthesis一起更改,会不会把一切都搞砸?托管对象上下文是NSManagedObject的必需属性,因此如果不将其插入上下文中,您无法正确初始化它的实例。它查看上下文以了解其实体,并在其任何属性更改时通知上下文 @dynamic和@synt

我希望像普通对象一样使用自定义NSManagedObject及其常规函数。是否可以修改类,以便能够像普通对象一样初始化它

[[myManagedObject alloc] init];
谢谢


编辑:为了澄清这个问题,如果我在实现中将@dynamic与@synthesis一起更改,会不会把一切都搞砸?

托管对象上下文是NSManagedObject的必需属性,因此如果不将其插入上下文中,您无法正确初始化它的实例。它查看上下文以了解其实体,并在其任何属性更改时通知上下文

@dynamic和@synthesis只是编译器指令。只要您自己提供合适的getter和setter,就可以从@dynamic切换到@synthesis。由于NSManagedObject在很大程度上依赖于键值,因此必须编写符合KVO的访问器


如果需要初始化NSManagedObject子类,可以重写awakeFromInsert,这样可以在创建实例时为其提供自定义。您还可以在每次使用awakeFromFetch获取对象时对其进行自定义。

托管对象上下文是NSManagedObject的必需属性,因此,如果不将其插入上下文,则无法正确初始化该对象的实例。它查看上下文以了解其实体,并在其任何属性更改时通知上下文

@dynamic和@synthesis只是编译器指令。只要您自己提供合适的getter和setter,就可以从@dynamic切换到@synthesis。由于NSManagedObject在很大程度上依赖于键值,因此必须编写符合KVO的访问器


如果需要初始化NSManagedObject子类,可以重写awakeFromInsert,这样可以在创建实例时为其提供自定义。您还可以在每次使用awakeFromFetch获取对象时自定义该对象。

我经常在我的一个应用程序中这样做。我的方法是使用以下命令初始化对象:

-(id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context
为上下文传递nil。要获取实体描述,您确实需要访问managedObjectContext。我倾向于在应用程序启动时获取实体描述,然后将其存储在应用程序委托中的实例变量中

下面是一个例子:

//inside my "Engine" class
self.tweetEntity = [NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:self.moc];

//later on when I want an NSManagedObject but not in a managed object context
Tweet *tweet = [[[Tweet alloc] initWithEntity:self.engine.tweetEntity insertIntoManagedObjectContext:nil] autorelease];
这允许我使用NSManagedObjects,而无需将它们存储在数据库中。稍后,如果我决定要将对象插入数据库,可以通过将其插入托管对象上下文来实现:

[self.moc insertObject:tweet];

我经常在我的一个应用程序中这样做。我的方法是使用以下命令初始化对象:

-(id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context
为上下文传递nil。要获取实体描述,您确实需要访问managedObjectContext。我倾向于在应用程序启动时获取实体描述,然后将其存储在应用程序委托中的实例变量中

下面是一个例子:

//inside my "Engine" class
self.tweetEntity = [NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:self.moc];

//later on when I want an NSManagedObject but not in a managed object context
Tweet *tweet = [[[Tweet alloc] initWithEntity:self.engine.tweetEntity insertIntoManagedObjectContext:nil] autorelease];
这允许我使用NSManagedObjects,而无需将它们存储在数据库中。稍后,如果我决定要将对象插入数据库,可以通过将其插入托管对象上下文来实现:

[self.moc insertObject:tweet];

谢谢现在看起来更清楚了!我想做的是像普通对象一样在持久性存储之外使用这些类;这似乎是不可能的谢谢。。。现在看起来更清楚了!我想做的是像普通对象一样在持久性存储之外使用这些类;这似乎是不可能的问题是,我的实体元素与实体成分有关系,当我尝试使用您的技术时,我尝试使用Element.component=anotherElement.component。我得到一个错误:“非法尝试在不同上下文中的对象之间建立“成分”关系”如果成分存储在托管对象上下文中,那么您将遇到问题。如果成分也是用initWithEntity初始化的,那么它应该可以工作。问题是我的entity元素与entity成分有关系,当我尝试使用您的技术时,我尝试执行Element.component=anotherElement.component。我得到一个错误:“非法尝试在不同上下文中的对象之间建立“成分”关系”如果成分存储在托管对象上下文中,那么您将遇到问题。如果成分也是用initWithEntity初始化的,那么它应该可以工作。