9

我有一个使用 Core Data 编写的应用程序。我有 2 个具有一对多关系的实体。我已经为他们两个子类化了 NSManagedObject。一侧的实体称为播放列表,另一侧的实体称为歌曲。

播放列表界面:

@interface VBPlaylist : NSManagedObject {
}

@property (readwrite, copy) NSString *name;

@end

播放列表的实现:

@implementation VBPlaylist

@dynamic name;

@end

我认为我应该有另一个属性来指示 Playlist 类下的 Songs。我找不到任何显示写为属性的多关系的示例代码。你怎么做到这一点?

4

3 回答 3

18

Core Data 将一对一关系建模为对象引用。Bar因此,从 Entity到 entity的一对一关系Baz(假设Baz由 class 实现Baz)将是

@interface Bar : NSManagedObject {
}

@property (readwrite,nonatomic) Baz * toBaz;

@end

对多关系被建模为可变集合属性(尽管不是NSMutableSetBar假设从到Baz调用的一对多关系manyBazz

@interface Bar : NSManagedObject {

}

@property (retain) NSSet* manyBazz;

@end

// coalesce these into one @interface AnalysisRecord (CoreDataGeneratedAccessors) section
@interface Bar (CoreDataGeneratedAccessors)
- (void)addManyBazzObject:(Baz *)value;
- (void)removeManyBazzObject:(Baz *)value;
- (void)addManyBazz:(NSSet *)value;
- (void)removeManyBazz:(NSSet *)value;

@end

如果你想使用 NSMutableSet 接口来操作manyBazz关系,你应该调用-mutableSetValueForKey:@"manyBazz"来获取一个符合 KVO 的manyBazz关系代理。

在 Leopard (OS X 10.5) 及更高版本上,所有适当的方法都是由 Core Data 框架在运行时自动生成的,即使你没有显式声明或实现它们(当然,如果你尝试,你会收到编译器警告使用它们而不在头文件中声明它们)。因此你不需要子类化

获得声明和实现权的最简单方法是在数据建模器中选择属性,然后从“设计->数据模型”菜单中选择“复制 Objective-C 2.0 方法声明到剪贴板”,粘贴到您的实现类中。 h 文件。当然,你必须让你的 .h 和模型保持同步……因此强烈推荐rentzsch 很棒的MO 生成器,一个可以从你的数据模型中自动生成(和重新生成)NSManagedObject 子类的工具。

于 2009-05-11T20:44:20.833 回答
16

为 CoreData 实体创建 .h 和 .m 文件的最简单方法是:

  1. 在数据建模器中选择一个实体。
  2. 按 Command-N 或选择 File->New File…</li>
  3. 从源列表中选择“Cocoa”。
  4. 在模板选择器中,您现在应该会看到一个名为“Managed Object Class”的项目。如果不存在,请单击取消并重复步骤 1-2。
  5. 按下一步,选择项目/目标,然后再次按下一步。
  6. 现在您会看到类似于以下窗口的内容:New Managed Object Class 窗口 http://blog.alanquatermain.net/images/ManagedObjectClass.png
  7. 选择您需要的选项,然后单击完成。

这将生成以下头文件和源文件:

实体.h:

#import <CoreData/CoreData.h>


@interface Entity :  NSManagedObject  
{
}

@property (retain) NSNumber * uniqueID;
@property (retain) NSString * name;
@property (retain) Entity * parent;
@property (retain) NSSet* children;

@end

@interface Entity (CoreDataGeneratedAccessors)
- (void)addChildrenObject:(Entity *)value;
- (void)removeChildrenObject:(Entity *)value;
- (void)addChildren:(NSSet *)value;
- (void)removeChildren:(NSSet *)value;

@end

实体.m:

#import "Entity.h"


@implementation Entity 

@dynamic uniqueID;
@dynamic name;
@dynamic parent;
@dynamic children;

@end

请注意,实现不包含任何东西,除了@dynamic标记告诉编译器不要担心缺少方法/变量来匹配属性。

于 2009-05-11T21:18:18.343 回答
2

这种情况略有改变。从 4.2.1(2012 年 3 月)开始,您将转到新文件;选择Core Data(不是Cocoa),然后选择New NSObjectModel subclass。从那里它产生如上所述的子类。

于 2012-03-14T18:22:50.503 回答