Swift、CoreData与多对多关系:如何访问子项的顺序?
Swift, CoreData and many-to-many-relationship: how to access order of subitems?
我有以下关系:
播放列表可以有一对多的歌曲,并且
歌曲可能属于一对多播放列表。
我的问题在于获取特定播放列表中歌曲的顺序 - 例如,
- 在播放列表1中,顺序可能是3,
- 在播放列表2中,顺序可能是1,
- 在播放列表 3 中,顺序可能是 5,依此类推
此外,播放列表中歌曲的顺序可以更改,因为它们在表格视图中列出。
我现在想跟踪订单。
我尝试了以下方法:
- 为 Song 实体创建新属性“PlaylistOrders”- 使用表示订单(播放列表的订单和 ManagedObjectId)的 NSSet,
- 正在创建一个名为“PlaylistOrders”的新实体并将其连接到“Song”。此新实体还包含一个 objectId (ManagedObjectId) 作为 Transformable。
这两种方法似乎都非常容易出错 - 此外,我经常收到警告,例如“'NSKeyedUnarchiveFromData' 不应用于取消存档,并将在未来的版本中删除”。
是否有更好更复杂的方法来存储和检索歌曲在不同播放列表中的顺序?
在数据模型中 Playlist
实体中 songs
关系的属性中,勾选“已排序”复选框。届时它们将以 NSOrderedSet
而不是 NSSet
。
感谢 Eugene,它现在可以工作了——我指的是 NSOrderedSet 的方法。
关于在表视图中重新排序歌曲项目的提示 - 以下代码片段显示了如何重新排列 NSOrderedSet 中的项目并将它们存储到 CoreData - 我们只需要一个 NSMutableOrderedSet:
func moveSongItemInPlaylist(playlist: Playlist, item: SongItem, fromOrder: Int, toOrder: Int) {
let orderedSet = playlist.mutableOrderedSetValue(forKey: "songItems")
let indices = IndexSet(integer: fromOrder)
if (fromOrder > toOrder) {
// we're moving up
orderedSet.moveObjects(at: indices, to: toOrder)
} else {
// we're moving down
orderedSet.moveObjects(at: indices, to: toOrder - indices.count)
}
do {
try self.managedObjectContext.save()
} catch {
print(error)
}
}
我有以下关系:
播放列表可以有一对多的歌曲,并且 歌曲可能属于一对多播放列表。
我的问题在于获取特定播放列表中歌曲的顺序 - 例如,
- 在播放列表1中,顺序可能是3,
- 在播放列表2中,顺序可能是1,
- 在播放列表 3 中,顺序可能是 5,依此类推
此外,播放列表中歌曲的顺序可以更改,因为它们在表格视图中列出。
我现在想跟踪订单。
我尝试了以下方法:
- 为 Song 实体创建新属性“PlaylistOrders”- 使用表示订单(播放列表的订单和 ManagedObjectId)的 NSSet,
- 正在创建一个名为“PlaylistOrders”的新实体并将其连接到“Song”。此新实体还包含一个 objectId (ManagedObjectId) 作为 Transformable。
这两种方法似乎都非常容易出错 - 此外,我经常收到警告,例如“'NSKeyedUnarchiveFromData' 不应用于取消存档,并将在未来的版本中删除”。
是否有更好更复杂的方法来存储和检索歌曲在不同播放列表中的顺序?
在数据模型中 Playlist
实体中 songs
关系的属性中,勾选“已排序”复选框。届时它们将以 NSOrderedSet
而不是 NSSet
。
感谢 Eugene,它现在可以工作了——我指的是 NSOrderedSet 的方法。
关于在表视图中重新排序歌曲项目的提示 - 以下代码片段显示了如何重新排列 NSOrderedSet 中的项目并将它们存储到 CoreData - 我们只需要一个 NSMutableOrderedSet:
func moveSongItemInPlaylist(playlist: Playlist, item: SongItem, fromOrder: Int, toOrder: Int) {
let orderedSet = playlist.mutableOrderedSetValue(forKey: "songItems")
let indices = IndexSet(integer: fromOrder)
if (fromOrder > toOrder) {
// we're moving up
orderedSet.moveObjects(at: indices, to: toOrder)
} else {
// we're moving down
orderedSet.moveObjects(at: indices, to: toOrder - indices.count)
}
do {
try self.managedObjectContext.save()
} catch {
print(error)
}
}