获取反向关系,而不是核心数据中的NSSet

时间:2013-01-02 16:19:23

标签: objective-c ios macos cocoa core-data

我是Core Data的新手。

在数据模型中,我有实体:

  • Song
  • Playlist

这是关系:

  • 每个Song属于no,one或多个Playlist

我已经将这种关系添加到模型中。
我也做了反 To-Many Relationship

现在我的问题。

Playlist现在有一个NSSet,其中包含Song个。{ 所以我可以通过playlist.songs访问它们。

我可以使用Song

获取任何特定的NSPredicate
- (NSArray *)fetchWithEntity:(NSString *)entity
                   predicate:(NSPredicate *)predicate
             sortDescriptors:(NSArray *)sortDescriptors
                       error:(NSError **)error {

    NSManagedObjectContext *moc = [self managedObjectContext];
    NSEntityDescription *entityDescription = [NSEntityDescription
                                              entityForName:entity
                                              inManagedObjectContext:moc];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];
    [request setPredicate:predicate];
    [request setSortDescriptors:sortDescriptors];

    NSArray *fetchResult = [moc executeFetchRequest:request error:error];
    return fetchResult;
}

但是,我希望也可以过滤特定播放列表的Song,而不必使用NSSet过滤NSPredicate,因为它只是更快

我该怎么做?

1 个答案:

答案 0 :(得分:2)

获取特定播放列表的歌曲,只需将"playlist = %@"添加到用于获取Song个对象的谓词中,例如

[NSPredicate predicateWithFormat:@"playlist = %@ AND title CONTAINS[cd] %@",
             thePlaylist, songTitle]

或者,如果播放列表由标题给出:

[NSPredicate predicateWithFormat:@"playlist.title = %@ AND title CONTAINS[cd] %@",
             playlistTitle, songTitle]

编辑如果歌曲和播放列表之间存在多对多关系,则可以将playlists定义为从歌曲到<的多个关系em>播放列表,与songs成反比关系。然后下面的谓词应该有效:

[NSPredicate predicateWithFormat:@"ANY playlist = %@ AND title CONTAINS[cd] %@",
             thePlaylist, songTitle]