【问题标题】:SwiftUI CoreData not in Set of relationshipsSwiftUI CoreData 不在关系集中
【发布时间】:2020-06-23 13:42:18
【问题描述】:

我有一个 CoreData 结构。它对我来说很好。现在我正在尝试做一个有趣的FetchRequest,但是我正在努力寻找正确的predicate

我有两个实体,PersonVenues。一个人可以连接到多个场所,但只能连接到同一个venue。和其他方式。

我创建了一个映射表,它将personvenue 保存为关系。这里一切正常。我什至实现了inverse 关系。

左图是我的场地。我想根据当前场地获取所有persons,该场地已经创建了NO Mapping

我的方法是使用pk_venue,它给了我一组PersonVenueMapping。但是,我怎样才能只使用该集合的persons

fetch.predicate = NSPredicate(format: "NOT (person IN %@)", venue!.pk_venue[HELP])

我想出了那个谓词。但是,我如何访问该集合的人员?我需要一个仅包含persons 的数组/集合,它们连接到当前对象。


编辑:只是给你举个例子。

人员:Max、Leon、Henry
地点:地点 1、地点 2、地点 3、地点 4

PersonVenueMapping:最大 Venue1

现在当我选择Max 时,我想要Venue2 & Venue3 & Venue4

提前致谢

【问题讨论】:

  • 为什么需要映射实体,为什么不在 Person 和 Venue 之间创建多对多映射?
  • 不,但也许您不需要 3 个这样的关系,具体取决于此上下文中的角色。
  • 如果设计是一个人有一个场地的角色,那么关系应该反映这一点。
  • 这看起来很像您将 CoreData 视为一个数据库,而实际上它并不是一个数据库。以应用程序将显示的方式对数据进行建模。不像标准化的 SQLite 数据库那样。
  • @Fogmeister 谢谢.. 是的,你是对的。我仍然习惯于来自常规关系数据库的 CoreData。你还说我不需要映射表?

标签: swift macos core-data swiftui


【解决方案1】:

您的模型看起来非常像规范化的数据库类型模型。 CoreData 不是数据库,因此使用它时对数据建模的一些要求更加灵活。例如many to many 关系是可能的(并且鼓励)。

以这种方式创建您的模型...

Person
------
name: String
------
assignedVenues: Many relationship to `venue` type

现在每个关系都有一个逆属性,所以...

Venue
------
name: String
------
managers: Many relationship to `Person` type

现在您只需执行以下操作即可从 Max 前往他指定的场地......

let selectedPerson = // fetch Max from CoreData

let venues = selectedPerson.assignedVenues

同样,您可以从一个场所找到所有管理它的人......

let someVenue = // fetch venue from CoreData

let managers = someVenue.managers

为了满足您查找 Max 未管理的所有场所的问题,您现在可以执行如下查询...

let selectedPerson = //fetch Max

let predicate = NSPredicate(format:"NONE managers == %@", selectedPerson) // Its been a long time since I did CoreData so forgive me if this syntax isnt correct but the idea is correct. :D

您现在可以使用该谓词来获取所有venues,其中 max 不是场地的经理之一。

通过删除 SQLite 等所需的“映射”...您可以让事情变得更简单。

【讨论】:

  • 哇.. 感谢您抽出宝贵的时间并写下来 :) 我很感激。真的又学到了很有帮助的东西。我将对我的 CoreData 结构进行更改并尝试您的查询。
  • @davidev 很高兴我能帮上忙。 :D 在raywenderlich.com 上有一些非常出色的教程,涵盖了很多关于如何使用 CoreData 的非常有用的技巧。绝对值得一读。
  • 还有一个问题出现.. 我仍然需要为一个关系存储一个角色。但是,我不能将该属性存储在人员实体或场所中,因为可以有更多与不同角色的关系。我如何在您的方法中使用它?
  • 在这种情况下,您可以将 Mapping 类型替换为 Role 并将其用作映射。我想这取决于您的特定模型要求,这需要一段时间才能研究。所以你可以只拥有Person <->> Role <<-> Venue 或类似的东西。可能还有其他更好的方法可以做到这一点。有了这个,我认为你的场地谓词可能类似于NONE jobs.manager == %@,但现在我超出了我的记忆能够存储的范围。 :D 其中jobs 是来自venue ->> role 的多个关系
【解决方案2】:

我很困惑您是在获取没有映射到给定地点的人,还是没有映射到给定人的地点。我假设是后者。

因此,您的获取请求将针对实体 Venue。让我们调用选定的人selectedPerson。以下谓词应该只返回那些没有映射到selectedPerson 的场地:

NSPredicate(format:”SUBQUERY(pk_venue, $M, $M.person == %@).@count == 0”, selectedPerson)

或者用自然语言“获取映射计数 ($M),person 等于所选人员,为零的场所”。

【讨论】:

  • 感谢您的回答先生。会测试,是的,你最后说的确实是正确的。这就是我想要实现的目标
猜你喜欢
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 2021-11-06
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多