SwiftUI CoreData不在关系集中
我有一个核心数据结构。这对我来说很好。现在我正在尝试做一个有趣的SwiftUI CoreData不在关系集中,swift,macos,core-data,swiftui,Swift,Macos,Core Data,Swiftui,我有一个核心数据结构。这对我来说很好。现在我正在尝试做一个有趣的FetchRequest,但是我正在努力寻找正确的谓词 我有两个世纪,个人和场馆。一个人可以连接到多个场馆,但只能一次连接到同一场馆。反之亦然 我创建了一个映射表,它将人员和地点保存为关系。这里一切都很好。我甚至实现了反向关系 照片左边是我的场地。我想根据当前地点获取所有人员,其中没有创建映射 我的方法是使用pku-venue,这给了我一套PersonVenueMapping。但是,我如何才能只使用该组的人员 fetch.pred
FetchRequest
,但是我正在努力寻找正确的谓词
我有两个世纪,个人
和场馆
。一个人可以连接到多个场馆,但只能一次连接到同一场馆
。反之亦然
我创建了一个映射表,它将人员
和地点
保存为关系。这里一切都很好。我甚至实现了反向关系
照片左边是我的场地。我想根据当前地点获取所有人员
,其中没有创建映射
我的方法是使用pku-venue
,这给了我一套PersonVenueMapping
。但是,我如何才能只使用该组的人员
fetch.predicate = NSPredicate(format: "NOT (person IN %@)", venue!.pk_venue[HELP])
我想出了那个谓词。但是,我如何访问该组的人员?我只需要连接到当前对象的人员的数组/集合
编辑:只是给你举个例子
人物:马克斯、莱昂、亨利
地点:第1、2、3、4场馆
PersonVenueMapping:最大Venue1
现在,当我选择Max
时,我想要Venue2
和Venue3
和Venue4
提前感谢我不清楚您是在获取未映射到给定场地的人员,还是在获取未映射到给定人员的场地。我假设是后者
因此,您的获取请求将针对实体场所。让我们呼叫所选人员selectedPerson
。以下谓词应仅返回那些没有映射到selectedPerson
的场所:
NSPredicate(format:”SUBQUERY(pk_venue, $M, $M.person == %@).@count == 0”, selectedPerson)
或者在自然语言中,“获取映射计数($M)为零的场所,其中person
等于所选人员”。您的模型看起来非常像标准化的数据库类型模型。CoreData不是一个数据库,因此在使用它时,建模数据的一些要求更加灵活。例如,多对多
关系是可能的(并且受到鼓励)
以这种方式创建您的模型
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
现在,您可以使用该谓词获取所有场馆
,其中max不是场馆经理之一
通过删除SQLite等中所需的“映射”。。。您可以让事情变得更简单。为什么需要映射实体,为什么不在人员和场馆之间创建一个多对多映射呢?不,但可能你不需要3个这样的关系,这取决于在此上下文中的角色是什么。如果设计是一个人有一个场馆的角色,那么这些关系应该反映出这一点。这看起来非常像你将CoreData视为一个数据库,而实际上它是一个数据库不是一个。以应用程序显示数据的方式对数据进行建模。不是以标准化的SQLite数据库看起来的方式。@Fogmeister谢谢。。是的,你是对的。我仍然习惯于使用来自常规关系数据库的核心数据。你的意思是我不需要映射表?谢谢你的回答,先生。威尔,是的,你最后说的确实是对的。这就是我想要达到的目标。。谢谢你抽出时间写下来:)我很感激。真的学到了一些非常有用的东西。我将更改我的CoreData结构,并尝试您的查询。@davidev很高兴我能提供帮助:D有一些非常优秀的教程,涵盖了许多关于如何使用CoreData的非常有用的技巧。绝对值得一读,还有一个问题。。我仍然需要为一个关系存储一个角色。但是,我无法将该属性存储在person实体或场所中,因为可能存在与不同角色的更多关系。我如何在您的方法中使用它?在这种情况下,您可以将映射
类型替换为角色
,并将其用作映射。我想这取决于您的具体模型要求,这需要一段时间才能了解。所以你可以只扮演Person>角色