【问题标题】:Core Data - Order of objects in a to-many relationship核心数据 - 一对多关系中的对象顺序
【发布时间】:2014-01-03 23:31:53
【问题描述】:

我的应用是一个音乐库应用,用户有他们的歌曲,他们可以创建播放列表。
我希望播放列表中歌曲的顺序与用户将这些歌曲添加到该播放列表中的顺序一致。

我的核心数据对象:

Song
=====
name
duration
album

artist (to one relationship)

Playlist
========
title

songs (to many relationship)  

我有一个播放列表的表格视图,该表格中的每一行都显示播放列表的标题和添加到该播放列表的最后一首歌曲的名称。

我有两个问题:

  1. 我如何知道用户添加到播放列表的最后一首歌是什么?甚至更多我怎么知道给定播放列表中歌曲的顺序?
  2. 在构建播放列表表格视图时,我应该如何获取最后的歌曲名称?

【问题讨论】:

    标签: ios iphone objective-c core-data nsfetchedresultscontroller


    【解决方案1】:

    在核心数据编辑器中将关系类型设置为有序。这意味着您现在将获得 NSOrderedSet 的歌曲,而不仅仅是 NSSet 的歌曲

    【讨论】:

    • 我的第二个问题呢,我知道我可以调用 [self.playlist.songs.allObjects lastObject] 但这对每个单元格来说都是正确的方法吗?它会获取所有对象还是仅获取我需要的对象?我正在寻找获取最后一首歌名的最有效方法
    【解决方案2】:

    您可以通过向数据模型中添加新实体来显式地为订单建模。

    PlaylistOrder
    =============
    index (an integer of some type)
    playlist (to one relationship)
    song (to one relationship)
    

    当您获取PlaylistOrder 托管对象时,按播放列表title 过滤,并按index 排序。

    为什么不将index 属性添加到Song 实体?据推测,一首歌曲可能属于多个播放列表。

    【讨论】:

      【解决方案3】:

      有序的关系是昂贵的。除非根本没有其他方法对数据进行排序,否则应该避免使用它们。在您的情况下,还有另一种对数据进行排序的方法。

      如果您将 insertedAtcreatedAt 属性添加到您的 Song 实体,您现在可以整理一些内容并获取歌曲的顺序。这将比使用有序关系更快且性能更好。随着您收集更多数据,这一点会变得更加明显。

      您可以从那里对新属性上的Song 实体进行排序,甚至在Playlist 实体中构建一个便捷方法以确定最后一个Song 是什么(按日期属性排序,获取最后一个对象)。

      更新 1

      由于一首歌曲可以在多个播放列表中,因此您可以在播放列表和歌曲之间创建一个元对象。实际上是一个包含数据的连接表:

      Playlist <<--> SongMeta <-->> Song
      

      SongMeta 实体将createdAt 作为属性,然后它为您提供了在该播放列表中添加有关歌曲的其他信息的位置。我过去在音乐应用程序中看到过这种设计。

      但是,如果您预见到用户能够任意重新排列播放列表,那么这肯定属于有序关系的狭窄有用范围。请注意与之相关的性能成本。

      【讨论】:

      • 但是一首歌可以出现在许多播放列表中,所以这里的一个属性不会帮助我
      • 我认为那些对多的箭头会被翻转?不是每首歌曲都有很多 SongMeta's - 这首歌在各种播放列表中的顺序。每个播放列表都会有许多歌曲元 - 播放列表中的每首歌曲都有一个。
      • 老实说@BigBoy1337,我现在不记得了。这篇文章是六年前的。
      猜你喜欢
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 2016-05-24
      相关资源
      最近更新 更多