使用基于属性的过滤的子元素集获取核心数据实体

时间:2014-12-30 22:20:58

标签: ios iphone core-data

我正在使用CoreData开发我的第一个应用程序,我正在努力解决我认为的常见问题。

假设我有一个实体播放列表,它与另一个实体歌曲和视频有多对多的关系。所以我的播放列表对象看起来像这样

class Playlist : NSManagedObject {
    var songs: NSSet
    var videos: NSSet
}

歌曲和视频实体都有一个“删除”的布尔字段,用于跟踪从播放列表中删除的歌曲或视频。我后来调用我的远程API在服务器端删除它,但这是出于脱机目的。

我想要的是从CoreData中检索一个播放列表对象,其中包含未删除的歌曲和视频列表(因此删除了= false)。

我看到的一个解决方案是通过简单地获取实体播放列表然后手动过滤来获取所有元素,但我想知道我是否可以使用Core Data更优雅地完成此操作。

1 个答案:

答案 0 :(得分:1)

欢迎使用核心数据。其工作方式如下:

首先获取播放列表。他们与歌曲有很多关系,无论他们是否被删除。 removed属性不在Playlist实体中,因此在获取播放列表时无关紧要。

然后通过应用谓词来获取过滤的属性集:

let validSongs = aPlaylist.songs.filteredSetUsingPredicate(
   NSPredicate(format: "removed = false")
) 

换句话说,您不必担心Core Data正在使用您的播放列表检索哪些歌曲。引擎盖下有很多优化,因此很可能Core Data将使用一种名为" faulting"只需检索所需的数据。你还有别的事情要做!

IMO,这也是最优雅的#34;解。为了使其更简洁,您可以向检索有效歌曲的Playlist实体添加方法。

func validSongs() -> NSSet {
   if !self.songs.count {  return NSSet()  }
   return self.songs.filteredSetUsingPredicate(
      NSPredicate(format: "removed = false")
   ) 
}

然后使用

访问有效歌曲
aPlaylist.validSongs