Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI CoreData不在关系集中_Swift_Macos_Core Data_Swiftui - Fatal编程技术网

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>角色