Swift 3 - 核心数据 - 获取结果控制器访问关系属性

时间:2016-09-22 18:07:58

标签: ios swift core-data entity fetch

正面临的问题是,当我与正在获取的实体建立关系时,我无法访问实体的属性。

关于我的应用程序,我正在创建一个健身追踪应用程序,我有一个详细的表视图控制器与我的跟踪活动。当我点击一个单元格时,视图会进入另一个视图控制器,以显示已跟踪位置的地图。

使用获取的结果控制器我正在获取" Entity1"。当我点击一个小区时,我想'我想要和我一起传递"实体2"属性值到另一个视图控制器。除了" Entity1"之间的关系到"实体2"对于许多人来说是一个"关系和" Entity1",

的核心数据属性
extension Entity1 
{
    // instead of "Entity2" being represented as
    // @NSManaged var entity2: Entity2?

    //it is represented as 
    @NSManaged var entity2: NSOrderedSet?
}

因此我无法访问" Entity2"属性。

我如何获取" Entity1":

func fetchEntity1ResultsController( _ context: NSManagedObjectContext )
{
    let request: NSFetchRequest<Entity1> = NSFetchRequest( entityName: "Entity1" )
    request.sortDescriptors  = [ NSSortDescriptor( key: "timestamp", ascending: false ) ]

    fetchedResultsController = NSFetchedResultsController( fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil )
    fetchedResultsController?.delegate = self

    do
    {
        try fetchedResultsController?.performFetch()
    }
    catch
    {
        print("Couldn't fetch results controller")
    }
}

我将如何尝试访问&#34; Entity2&#34;属性。

private func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{
    guard let entity1 = fetchedResultsController?.object(at: indexPath) else { return }

    entity1.entity2.//No core data properties listed here
}

总结:我的问题是 - 如何点击作为&#34; Entity1&#34;的单元格?描述&#34; Entity2&#34;与...相关并且访问&#34; Entity2&#34;属性值以在我的地图视图控制器中显示该数据。

1 个答案:

答案 0 :(得分:2)

由于这是一种多对多关系,因此您调用的entity2是一组Entity2的多个实例。这就是“to-many”中“很多”部分的含义 - 一个Entity1与多个Entity2实例的集合相关。您无法访问集合上的Entity2属性,因为它是多个实例的集合。要访问Entity2属性,首先需要从集合中选择一个对象。

你如何做到这一点取决于你的应用程序应该如何工作。您有NSOrderedSet,它有多种选项可供选择其中包含的对象之一。您可以在有序集中的特定位置请求第一个对象或最后一个对象或Entity2。除了这些之外还有其他选择;有关它们的更多信息,请参阅NSOrderedSet文档。