了解NSManagedObject

时间:2010-07-31 10:24:19

标签: objective-c core-data nsmanagedobject

在现有项目中,我尝试在项目创建很久之后引入Core Data,因此其模型已经到位。 我创建了xcdatamodel并添加了我唯一的类。 该类应该充当我的应用程序中对象的全局存储。 该类正确实现了NSManagedObject,我已经验证它是在上下文中创建和保存的,也是通过获取结果检索的。

在此类中保存数据的方法是通过NSMutableArray。但这不起作用。这是这个类的一个片段:

@interface WZMPersistentStore : NSManagedObject<NSCoding> {
 NSMutableArray *persistentStorage;
}

@property(nonatomic,retain) NSMutableArray *persistentStorage;

-(void)add:(id)element;
-(void)remove:(id)element;
-(id)objectAtIndex:(NSUInteger)index;
-(NSUInteger)num;

@end

在实现中,我还覆盖了initWithEntity,如下所示:

- (id)initWithEntity:(NSEntityDescription*)entity insertIntoManagedObjectContext:(NSManagedObjectContext*)context {
 NSLog(@"init with entity");
 [super initWithEntity:entity insertIntoManagedObjectContext:context];

 return [self init];
}

init方法只初始化可变数组,我可以从日志中看到创建实体时应用程序委托正确调用它。 add方法只是将消息insertObject发送到persistentStorage。 由此产生的问题:

  1. 我在“概念上”做得对吗?一世 意思是,拥有实例是正确的 托管对象中的变量和 像我一样初始化?
  2. 当ns记录大小时 persistentStorage我总是0 即使在记录片刻之后 addObject message (编辑:那不是 是的,我已经再次验证了我 正确地添加了1)
  3. 存储在托管对象中的对象 class trough persistentStorage是 带属性的普通类。是 我需要做些什么 他们?我想不是因为我 在运行时没有收到任何错误。

2 个答案:

答案 0 :(得分:2)

,这不是“正确”的做法。您可以在awakeFromFetch中执行实例变量的初始化。 NSManagedObject子类的Apple准则包括以下内容:

  

你也沮丧   覆盖   initWithEntity:insertIntoManagedObjectContext:,   deallocfinalize。改变价值观   在里面   initWithEntity:insertIntoManagedObjectContext:   方法不会被注意到   上下文,如果你不小心,   这些更改可能无法保存。最   初始化定制应该是   在其中一个清醒中表演......   方法。如果你覆盖   initWithEntity:insertIntoManagedObjectContext:,   你必须确保你坚持   方法中规定的要求   说明[...](NSManagedObject Class Reference

要真正提供帮助,我需要更深入地了解您要完成的任务。无论如何,我强烈建议在继续之前梳理Apple的Core Data Programming Guide和示例代码。

答案 1 :(得分:0)

我终于设法解决了这个问题。即使我是objective-c的新手,我认为在项目完成后引入核心数据也不是一个好主意。即使许多人声称这很容易。不幸的是,所有人这样说,都显示了一个实体的简单教程,其中一个实体有一个字符串属性可以改变。 相反,对于我的项目,除了现有的代码之外,我最终还编写了许多代码,加上一些子类化(例如NSManagedObject),它打破了原始模型。添加的代码也必须仔细编写。派生问题可以像未保存的属性一样简单,也可以像删除错误的实体一样危险。

事实上,我的问题是由于序列化过程中涉及的类中的解码和编码方法配置错误。

我的问题:

-Point one仍然没有答案,因为我对objective-c

还不自信

-Point二,正如我所说,相关对象在编码/代码方面存在一些问题。

- 第三点,我错了,需要编写很多代码,具体取决于相关类的复杂程度。