IOS:通过一对多关系获取核心数据
Posted
技术标签:
【中文标题】IOS:通过一对多关系获取核心数据【英文标题】:IOS: Fetch core data through one to many relationship 【发布时间】:2016-02-20 13:32:32 【问题描述】:我有一个包含多个实体的数据模型。对于加入一对一关系的实体,从一个实体获取后,我可以通过关系访问另一个实体的属性。
//class for artists
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class Songs;
@interface Artists : NSManagedObject
@property (nonatomic, retain) NSString * artistname;
//this is relationship
@property (nonatomic, retain) Songs *songs;
//class for Songs
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class Artists;
@interface Songs : NSManagedObject
@property (nonatomic, retain) NSString * songname;
//this is relationship
@property (nonatomic, retain) Artists *artists;
如果关系是一对一的,一旦我执行了艺术家的获取并拥有一个 managedobjectcontext,我可以使用以下方法获取每个艺术家的歌曲:
NSLog(@"song for one hit wonder%@",self.artists.songs.songname);
当我将关系从一对一更改为一对多时,即一位艺术家,多首歌曲,这不再有效并引发引用[_NSFaultingMutableSet songname
的错误
我尝试使用 value for key 访问歌曲,但没有成功。
NSLog(@"songs:%@",self.artists.songs.valueForKey[@"songname"]);
此外,我尝试在某处合并 NSSet,因为错误消息引用了可变集,并且据说以这种方式捕获了一对多关系,但我无法弄清楚如何使用 NSSet。
NSSet *songs = self.artists.songs.songname;//gives incompatible pointer type warning
任何关于如何在一对多关系的情况下从另一个实体检索值的建议将不胜感激。
【问题讨论】:
【参考方案1】:首先,将 Core Data 实体的名称设置为复数形式有点令人困惑,因为它总是暗示 many。
如果您将模型中的关系从一对一更改为一对多,则必须将 NSManagedObject
子类中的类型更改为 NSSet
,例如
@property (nonatomic, retain) NSSet *songs;
您可以通过在 Xcode 中自动重新创建 NSManagedObject
子类来证明这一点。
【讨论】:
好的。那么 NSString 会变成 NSSet 吗? 我将 NSString 更改为 NSSet 仍然得到 [_NSFaultingMutableSet 歌曲名称错误 我更新了答案。最简单的解决方法是在 Xcode 中重新创建NSManagedObject
子类。
您的答案是有道理的,但重新创建并仍然出现相同的错误。
假设您有一个名为johnDoe
的Artists
实例,您将获得带有NSSet *songs = johnDoe.songs;
的歌曲和带有Songs *song = [songs anyObject];
的歌曲名称NSString *songName = song.songname;
以上是关于IOS:通过一对多关系获取核心数据的主要内容,如果未能解决你的问题,请参考以下文章