【问题标题】:Property declaration for to-many relationships in Core DataCore Data 中对多关系的属性声明
【发布时间】:2010-10-25 09:31:52
【问题描述】:

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

播放列表界面:

@interface VBPlaylist : NSManagedObject {
}

@property (readwrite, copy) NSString *name;

@end

播放列表的实现:

@implementation VBPlaylist

@dynamic name;

@end

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

【问题讨论】:

  • 另外,请查看this blog post 以非常轻松地自动生成类。

标签: objective-c cocoa macos core-data


【解决方案1】:

Core Data 将一对一关系建模为对象引用。所以从实体Bar 到实体Baz 的一对一关系(假设BazBaz 类实现)将是

@interface Bar : NSManagedObject {
}

@property (readwrite,nonatomic) Baz * toBaz;

@end

对多关系被建模为可变集合属性(尽管不是NSMutableSet)。假设从BarBaz 的一对多关系称为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" 来为manyBazz 关系获取一个符合KVO 的代理。

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

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

【讨论】:

  • 所以在这种情况下,如果我想向 Bar 添加一个 Baz 对象,我可以这样做:[barInstance addManyBazzObject:bazInstance] 或 bazInstance.bar=barInstance?
  • 我想你忘了说完最后一句话。
  • 谢谢,彼得。哎呀。现在应该修好了。
  • 很遗憾,“MO Generator”的链接现在好像坏了。
  • @Chris,链接应该是固定的。以后,请随时自行修复其他帖子中的此类错误;每个人都受益于一些恒定的 TLC 到有用的信息。我不确定此类编辑的代表截止点在哪里,但我相信你很快就会到那里。
【解决方案2】:

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

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

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

Entity.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

Entity.m:

#import "Entity.h"


@implementation Entity 

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

@end

请注意,除了 @dynamic 标记之外,实现不包含任何内容,以告诉编译器不要担心缺少与属性匹配的方法/变量。

【讨论】:

  • 酷。生成的代码为如何进行设置提供了很好的示例。我今天一直在使用它。
【解决方案3】:

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

【讨论】:

  • 另外,CMD+N 而不是 file->new
猜你喜欢
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 2016-04-07
  • 1970-01-01
相关资源
最近更新 更多