2

在一个现有项目中,我尝试在项目创建很久之后引入 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 记录持久存储的大小时,即使在 addObject 消息之后记录片刻,我也总是得到 0 (编辑:这不是真的,我再次验证并且我正确地添加了 1)
  3. 通过persistentStorage 存储在托管对象类中的对象是具有属性的普通类。我需要和他们做些什么吗?我想不是因为我在运行时没有收到任何错误。
4

2 回答 2

2

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

也不鼓励您覆盖 initWithEntity:insertIntoManagedObjectContext:, deallocfinalizeinitWithEntity:insertIntoManagedObjectContext: 上下文不会注意到方法中的值更改 ,如果您不小心,这些更改可能不会被保存。大多数初始化定制应该在其中一种唤醒…方法中执行。如果您确实覆盖 initWithEntity:insertIntoManagedObjectContext:,您必须确保遵守方法描述中列出的要求 [...] ( NSManagedObject 类参考)

要真正提供帮助,我需要更深入地了解您要完成的工作。无论如何,我强烈建议在继续之前梳理一下 Apple 的核心数据编程指南和示例代码。

于 2010-08-06T03:20:55.617 回答
0

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

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

对于我的问题:

-第一点仍然没有答案,因为我对objective-c还没有信心

-第二点,正如我所说,相关对象的编码/代码有问题。

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

于 2010-08-01T19:07:51.833 回答