我有一个 CoreData 结构。它对我来说很好。现在我正在尝试做一个有趣的 FetchRequest
,但是我正在努力寻找正确的 predicate
.
我有两个实体,Person
和 Venues
.一个人可以连接到多个 field ,但只能连接一次venue
.和其他方式。
我创建了一个映射表,其中保存了 person
和 venue
作为关系。这里一切正常。我什至实现了 inverse
关系。
左图是我的 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/