根据 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
相关联,我认为实现这一点的最简单方法是在您的核心数据模型中定义Entity1
和Entity2
之间的一对多关系。
-
选择
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 中的关系获取与特定实体相关的所有条目的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 Core Data 中的关系对象创建 UITableView 部分
如何在 Documents 文件夹中保存 UIImagePicker 中的 UIImage 并获取路径字符串以保存在 Swift 中的 Core Data 中