Ios 在Swift核心数据中从多个关系获取对象
围绕使用Swift在核心数据中的许多关系,我遇到了一些困难 我的数据模型 我想做的是使用Ios 在Swift核心数据中从多个关系获取对象,ios,swift,core-data,one-to-many,Ios,Swift,Core Data,One To Many,围绕使用Swift在核心数据中的许多关系,我遇到了一些困难 我的数据模型 我想做的是使用国家的一个实例,然后显示该国家的所有联系人。由于我一直在尝试这样做,我构建了一个UITableViewController,它将显示该国的所有公民。然而,我遇到了一个主要问题,那就是如何将实际的联系人从与国家公民的关系中分离出来。下面是我正在使用的代码(仅相关部分) 所以,这根本不起作用。现在在for循环中,我得到一个编译器错误,它说类型“Contacts”不符合协议“Sequence Type”。我不明白
国家的一个实例
,然后显示该国家的所有联系人
。由于我一直在尝试这样做,我构建了一个UITableViewController,它将显示该国的所有公民。然而,我遇到了一个主要问题,那就是如何将实际的联系人
从与国家公民的关系中分离出来。下面是我正在使用的代码(仅相关部分)
所以,这根本不起作用。现在在for循环中,我得到一个编译器错误,它说类型“Contacts”不符合协议“Sequence Type”
。我不明白的是这只是一种接触。。。我想这应该是一种收藏。所以,这不起作用,所以我尝试了这个
let listOfPeople = countryToShow!.citizensOfCountry as! [Contacts]
这也不起作用,我得到一个错误,“NSArray”不是“Contacts”的子类型。
。接下来,我尝试使用NSSet进行转换
let listOfPeople = countryToShow!.citizensOfCountry as! NSSet<Contacts>
这管用!我可以打印出该国所有公民的姓名。但是我不明白为什么。当我使用valueForKey(“name”)
但无法获得个人联系人时,为什么它会起作用?有没有更好的方法来做这件事,我只是错过了?非常感谢您对我无法从一个国家获得联系人的任何解释。谢谢 出现错误的原因是“多对多”关系导致了一个NSSet
。所有迭代这些集合的尝试都应该考虑到这一点
更好的方法是实现一个NSFetchResultsController
,这是在表视图中显示核心数据的标准方式
- 在联邦储备委员会,找人
- 让财务报告委员会根据您的需要进行分类
- 给它一个谓词,用于过滤
countryToShow
财务汇报委员会的实施:
var fetchedResultsController: NSFetchedResultsController {
if _fetchedResultsController != nil {
return _fetchedResultsController!
}
let fetchRequest = NSFetchRequest(entityName: "Contact")
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
fetchRequest.predicate = NSPredicate(format:"countryOfOrigin = %@", self.countryToShow!)
let aFetchedResultsController = NSFetchedResultsController(
fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext!,
sectionNameKeyPath: nil, cacheName: nil)
_fetchedResultsController = aFetchedResultsController
var error: NSError? = nil
if !_fetchedResultsController!.performFetch(&error) {
NSLog("%@", error!)
}
return _fetchedResultsController!
}
var _fetchedResultsController: NSFetchedResultsController? = nil
我把Contacts改成了更合适的单数。对不起,我实在太累了,我看不懂所有的东西。但是从我所读到的,你想得到一个国家的公民,这个国家应该是一个NSSet。要做到这一点,您只需执行以下操作:
let contacts = yourArrayOfCountries.flatMap {
$0.citizensOfCountry.allObjects as! [Contacts]
}
根据你的评论:
let contacts = countryToShow!.citizensOfCountry.allObjects as! [Contacts]
那么在这个解决方案中,我会使用citizensOfCountry
关系吗?或者我只是根据他们的countryOfOrigin
关系过滤所有联系人?这是一样的,因为他们是反向关系。因为您使用的是联系人
实体,所以您将使用原产国
。我会修改我的答案,让你看看是怎么做的。只是出于我自己的好奇,如果我已经找到了国家
,那么利用公民与国家
的关系来找到联系人
,不是会更有效吗?原则上是这样的。但是,您不能将“获取结果”控制器用于表视图,因为它具有所有附加的优点。对不起,我太累了,无法阅读所有内容。但是从我所读到的,你想要得到一个国家的公民,这个国家应该是一个NSSet
。要实现这一点,您只需执行以下操作:yourrayofcountries.flatMap{$0.citizensOfCountry.allObjects as![Contacts]}
。我将把它作为一个答案发布,以便于阅读。这可能是因为我做了一些愚蠢的事情,但我写了let listOfPeople=countryToShow!。citizensOfCountry.flatMap{$0.citizensOfCountry.AllObject as![Contacts]}
我得到了一个错误“Contacts”没有名为“flatMap”的成员这是你的意思吗?你只能在数组上使用flatMap
。您所做的是在NSSet
上,因此它不起作用。尝试countryToShow!。平面地图{$0.citizensOfCountry.allObjects as![Contacts]}
。我假设countryToShow
是Country
的数组。是的,这也不行countryToShow
是一个国家对象,我正试图通过这种关系找到该国的公民。如果您介意的话,我使用您的代码得到的错误是,'Country'没有名为'flatMap'的成员。
啊,对不起,我假设countryToShow是一个数组。我会更新答案。让contacts=countryToShow!。citizensOfCountry.allObjects as![联系人]
应该可以工作。让我知道:)
let contacts = yourArrayOfCountries.flatMap {
$0.citizensOfCountry.allObjects as! [Contacts]
}
let contacts = countryToShow!.citizensOfCountry.allObjects as! [Contacts]