在Swift Core Data中获取多对象关系

时间:2015-06-07 06:09:13

标签: ios swift core-data one-to-many

我一直在使用Swift在Core Data中使用to-many关系时遇到一些困难。

我的数据模型

enter image description here

我要做的是使用Country的实例,然后显示该国家/地区公民的所有Contacts。正如我一直在尝试这样做,我构建了一个UITableViewController,它将显示该国家的所有公民。但是,我遇到了从关系Contacts中获取实际citizensOfCountry的主要问题。这是我正在使用的代码(仅限相关部分)。

class ShowingCitizensOfCountry: UITableViewController {

     var countryToShow: Country?
     //This is a value that is passed by a prepareForSegue method
     override func viewDidLoad() {
          //how do I get a list/set/other iterable object of Contacts?

          //***Line in question***
          let listOfPeople = countryToShow!.citizensOfCountry

          for citizen in listOfPeople {
              println(citizen)//THIS IS NOT WORKING
          }

     }

所以,这根本不起作用。现在在for循环中,我得到一个编译器错误,上面写着Type 'Contacts' does not conform to protocol 'Sequence Type'。我不明白的是它只是类型联系...我会认为这将是某种集合。所以,这不起作用所以我试过了。

let listOfPeople = countryToShow!.citizensOfCountry as! [Contacts]

这也不起作用,我收到错误'NSArray' is not a subtype of 'Contacts'。接下来我尝试使用NSSet进行转换。

let listOfPeople = countryToShow!.citizensOfCountry as! NSSet<Contacts>

不幸的是,这也不起作用,我收到警告Cast from 'Contacts' to unrelated type 'NSSet' always failsCannot specialize non-generic type 'NSSet'。接下来我尝试了别的东西。我尝试使用valueForKey方法。

let listOfPeople = countryToShow!.citizensOfCountry.valueForKey("name") as! Set<String>

这个有效!我只能打印出该国公民的所有人的名字。但是我不明白为什么。为什么当我使用valueForKey("name")但我无法获得个人联系时,它是否有效?有没有更好的方法来做到这一点,我错过了?我非常感谢您解释为什么我无法从单个Contacts获取Country的集合。谢谢。

2 个答案:

答案 0 :(得分:7)

抱歉,因为我真的很累,所以无法阅读所有内容。但是从我读过的内容来看,你想要得到一个应该是NSSet的国家的公民。为此,你可以做到:

let contacts = yourArrayOfCountries.flatMap { 
    $0.citizensOfCountry.allObjects as! [Contacts] 
}

根据你的评论:

let contacts = countryToShow!.citizensOfCountry.allObjects as! [Contacts]

答案 1 :(得分:2)

您的错误原因是多对多关系会产生NSSet。您尝试迭代这些集合的所有尝试都应考虑到这一点。

更好的是实现NSFetchResultsController,这是在表格视图中显示核心数据的标准方法。

  • 在FRC中,抓取人
  • 根据您的需要进行FRC排序
  • 为其添加谓词,以过滤countryToShow

FRC实施:

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

我将联系人变成了更合适的单数。