根据 Swift Core Data 中的关系获取与特定实体相关的所有条目

Posted

技术标签:

【中文标题】根据 Swift Core Data 中的关系获取与特定实体相关的所有条目【英文标题】:Get all entries related to a specific Entity based on relationship in Swift Core Data 【发布时间】:2018-02-27 02:41:17 【问题描述】:

我有一个简单的两个实体核心数据数据库 实体 1 - 属性 1 - 属性 2 实体 2 - 属性 1

定义了关系,因此对于每个实体 1,我可以拥有许多实体 2。

我选择了一个实体 1 - 通过 UITableView 我现在想检索所有 Entity 2 记录。我正在尝试使用 NSPredicate,但这似乎是错误的方式。这是代码 - 它不能为 NSPredicate 调用初始化:

   lazy var entity2Predicate: NSPredicate =  return NSPredicate(format: "%K = %@", #keyPath(Entity1.relationship), ascending: true)()

为与 Entity1 相关的所有 Entity2 记录定义提取的正确方法是什么?

【问题讨论】:

【参考方案1】:

如果您的Entity2 总是与一个Entity1 相关联,我认为实现这一点的最简单方法是在您的核心数据模型中定义Entity1Entity2 之间的一对多关系。

    选择Entity1。在关系下,单击 + 按钮添加关系。把它命名为有意义的东西。由于您没有告诉我们您的实体的真实姓名,我将在此示例中将关系称为entityTwos。 将关系类型设置为“对多”。 如果Entity1 不需要有任何Entity2,则将关系设置为可选。 将删除规则设置为“级联”,这样当Entity1 被删除时,所有相关的Entity2 也会被删除。 现在,选择Entity2。添加一个关系,给它一个名字(比如entityOne),并将它的 Inverse 设置为在第 1 步中创建的关系的名称(在这个例子中是entityTwos)。 取消选中 Optional 选项,并将 Type 设置为“To One”。将删除规则设置为“无效”。

您还需要为实体类中的关系添加属性。在Entity1:

@NSManaged var entityTwos: NSSet

Entity2:

@NSManaged var entityOne: Entity1

完成后,您无需任何查询即可轻松访问与Entity1 相关的所有Entity2,如下所示:

//here, entity1 is an instance of Entity1
entity1.entityTwos

真正酷的是你也可以走另一条路:

//here, entity2 is an instance of Entity2
entity2.entityOne

【讨论】:

谢谢,还有一个问题。首先是的,Entity2 只会匹配一个 Entity1,但是我可以有一个没有 Entity2 的 Entity1,所以在这种情况下,我将其选中为可选。如果我抓住 Entity1.entityTwos - 我假设它返回一个集合,然后我可以分配给一个 tableview 以滚动所有值。 (我知道这句话有点过于简单化了,但我在加载 Entity1 的列表时已经完成了这个基本概念。) 是的,没错。 entityTwos 是一个 NSSet,它具有用于访问对象的 allObjects 属性。我通常将其强制转换为数组,因为数组更易于使用:entity1.entityTwos.allObjects as! [实体2]。 将提出另一个问题,因为我现在遇到了不同的崩溃,我认为这就是我尝试加载 NSSet(并处理空集)的方式

以上是关于根据 Swift Core Data 中的关系获取与特定实体相关的所有条目的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 Core Data - 无法保存关系值

如何使用swift 3仅获取Core Data中的一列数据

如何根据 Core Data 中的关系对象创建 UITableView 部分

如何在 Documents 文件夹中保存 UIImagePicker 中的 UIImage 并获取路径字符串以保存在 Swift 中的 Core Data 中

如何获取 Core Data 中的关系项属性?

如何快速获取 Core Data 中的关系