【问题标题】:SwiftUI & CloudKit - CoreData Many to Many RelationshipsSwiftUI & CloudKit - CoreData 多对多关系
【发布时间】:2020-12-12 23:39:39
【问题描述】:

我是 Swift UI 的新手,也是第一次使用 CoreData 和 CloudKit。我的很多问题已经可以通过现有的教程或类似的已经回答的问题来回答。但我在 CoreData 中找不到多对多关系的好资源。

在我的项目中,用户可以通过按下按钮来保存标记/时间戳,这会触发将数据保存在 CoreData 中的功能。当录制完成时,用户可以保存时间戳,通过一个按钮按下一个功能将录制保存到 CoreData。我的目标是记录保存并包含所有创建和保存的标记/时间戳,因此用户可以在项目/记录上单击他的历史记录并获取此记录的所有标记/时间戳。

那时我可以保存并创建标记和记录,但不能将它们相互链接。

我怎样才能以最简单的方式做到这一点 - 使用多对多关系?多对多关系如何在我的代码中工作?

非常感谢您的帮助和想法!

罗伯特 PS:在照片上你可以看到我已经尝试创建关系,但我无法使用函数创建它们...

Data Model

Functions

Relationships

【问题讨论】:

  • 请您将代码发布为文本,而不是图片链接 - 这样更容易查看。至于你的模型,在我看来你的关系应该是一对多,而不是多对多:每个记录可以有很多标记,但每个标记只与一个记录相关?
  • 您好,首先感谢您的快速反馈!关于关系类型:我有可用于许多项目的标记(例如:Intro、Mute、Edit、ChapterMark)。我认为它也可能与一个规则是一对多的关系,如果项目被删除,则标记不是。不幸的是,屏幕截图中的整个代码在这里太长了,你能说出你想要的部分吗?
  • 那么您是说 Intro、Mute、Edit、ChapterMark 等是 Marker 实体的实例,而您的 UsedMarker 实体代表一个标记实例的使用,对于一个记录,在给定时间戳?
  • 是的。带有颜色、名称和图标的标记本身存储在 MarkerItem 实体中,当我使用它时,它会给出他的值 + 时间戳并保存在 UsedMarker 实体中。我从该应用程序制作了一个视频,也许它可以帮助您更好地理解。正如你所看到的,项目/录音现在在 ForEach 中并且没有被提取,因为我无法将使用过的标记链接到录音并保存它...youtu.be/MXmUI6kTCpo

标签: swift core-data swiftui cloudkit


【解决方案1】:

如果我理解正确,您的UsedMarker 代表特定MarkerItem 的特定timestamp 的特定Recording 的使用。因此,我将从UsedMarkerRecording 的关系建模为一对一。

查看您当前的模型,UsedMarker 具有颜色、名称和图标的属性,您将其描述为来自MarkerItem 实体。我会避免这种重复,并将这些属性替换为从 UsedMarkerMarkerItem 的一对一关系。

当它们是to-one 时,在代码中定义关系非常简单。如果你有一个Recording 对象,比如currentRecording,并且用户在给定的时间戳添加了一个特定的MarkerItem,比如chosenMarker,那么你可以在分配关系时创建一个新的UsedMarker

let useMarker = UsedMarker(context: self.context)
useMarker.recording = currentRecording
useMarker.markerItem = chosenMarker
useMarker.id = UUID()
useMarker.hours = ... // etc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多