【问题标题】:How to property save the updated managed object that has one-to-many relationships with other entities?如何属性保存与其他实体具有一对多关系的更新的托管对象?
【发布时间】:2020-12-12 15:50:57
【问题描述】:

如果我的核心数据中有三个实体,它们彼此之间都具有一对多关系:

extension Progress {

    @nonobjc public class func createFetchRequest() -> NSFetchRequest<Progress> {
        return NSFetchRequest<Progress>(entityName: "Progress")
    }

    @NSManaged public var goal: Goal
    @NSManaged public var metric: Set<Metric>

}

extension Metric {

    @nonobjc public class func createFetchRequest() -> NSFetchRequest<Metric> {
        return NSFetchRequest<Metric>(entityName: "Metric")
    }
    
    @NSManaged public var value: NSDecimalNumber
    @NSManaged public var metricToGoal: Goal
    @NSManaged public var progress: Progress

}

extension Goal {

    @nonobjc public class func createFetchRequest() -> NSFetchRequest<Goal> {
        return NSFetchRequest<Goal>(entityName: "Goal")
    }

    @NSManaged public var title: String
    @NSManaged public var progress: Set<Progress>
    @NSManaged public var goalToMetric: Set<Metric>
}

如果获取实体之一并更新它:

let metricRequest = Metric.createFetchRequest()
metricRequest.predicate = NSPredicate(format: "value == %@", metric.value)
if let fetchedMetric = try? self.context.fetch(metricRequest) {
   // update Metric
}

我是否还必须获取其余两个实体并将新更新的实体附加到它们?

if let fetchedGoal = try? self.context.fetch(goalRequest) {
   fetchedGoal.goalToMetric.append(updatedMetric)
}

if let fetchedProgress = try? self.context.fetch(goalProgress) {
   fetchedProgress.metric.append(updatedMetric)
}

或者 Core Data 是否足够聪明,我只需要为更新的实体保存上下文,然后它会处理其余的事情?

【问题讨论】:

    标签: ios swift core-data nsmanagedobject


    【解决方案1】:

    我是否还必须获取其余两个实体并将新更新的实体附加到它们?

    没有。 您可以阅读有关关系数据库如何工作的更多信息,here

    单个Metric 对象对应于CoreData 支持的数据库中专用表中的单个记录。 如果您更新Metricvalue - 无需更新关系。 在一对多关系的情况下,数据库中的每条Metric 记录将只存储GoalProgress 中的ObjectIDGoalProgress 记录都不会存储与它们相关的指标的任何信息。

    【讨论】:

    • 可能值得一提的是,尽管 Core Data 内部使用 SQLite,但它的 API 在某些方面与关系数据库有很大不同。例如,该页面描述了使用外键来管理关系。 Core Data 可能会在内部这样做,但尝试在 Core Data 中使用外键几乎不是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多