SwiftUI 核心数据不在关系集中

标签 swift macos core-data swiftui

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

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

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

enter image description here

左图是我的 field 。我要获取所有 persons基于当前 field ,其中有 无映射 已经创建。

我的方法是使用 pk_venue ,这给了我一套 PersonVenueMapping .但是,我怎么只能使用persons那套。

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

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

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

人物:马克斯、里昂、亨利
field : field 1、 field 2、 field 3、 field 4

PersonVenueMapping:最大 <-> Venue1

现在当我选择 Max , 我要 Venue2 & Venue3 & Venue4
提前致谢

最佳答案

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

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

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

现在每个关系都有一个逆属性,所以......
Venue
------
name: String
------
managers: Many relationship to `Person` type

现在,您只需执行以下操作即可从 Max 前往他指定的 field ...
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 不是 field 的经理之一。

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

关于SwiftUI 核心数据不在关系集中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60638300/

相关文章:

arrays - 如何使用多个 OR 语句根据对象的属性过滤数组

linux - 重命名批量文件并更改某些前缀并保存它们

swift - Xcode 11.4 中 Assets 目录编译 (atool) 失败

ios - 多个 NSPersistentStoreCoordinator 实例可以连接到同一个底层 SQLite 持久存储吗?

swift - (存档)Swift Range 支持 float 吗?

swift - 当 UITableView 为空时显示消息

ios - 更改导航栏颜色

xcode - 无法在 OSX 10.15.4 上使用 asdf 安装 Erlang

core-data - 解包可选值时意外发现 nil - Swift

ios - 为什么在一个 View 中有不同的不同上下文?