【问题标题】:Get all entries related to a specific Entity based on relationship in Swift Core Data根据 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 记录定义提取的正确方法是什么?

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

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

    1. 选择Entity1。在关系下,单击 + 按钮添加关系。把它命名为有意义的东西。由于您没有告诉我们您的实体的真实姓名,我将在此示例中将关系称为entityTwos
    2. 将关系类型设置为“对多”。
    3. 如果Entity1 不需要有任何Entity2,则将关系设置为可选。
    4. 将删除规则设置为“级联”,这样当Entity1 被删除时,所有相关的Entity2 也会被删除。
    5. 现在,选择Entity2。添加一个关系,给它一个名字(比如entityOne),并将它的 Inverse 设置为在第 1 步中创建的关系的名称(在这个例子中是entityTwos)。
    6. 取消选中 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(并处理空集)的方式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多