如何在CoreData中将数据存储为多对多关系?

时间:2017-01-21 19:46:02

标签: ios swift xcode core-data

所以,我正在开发一个锻炼跟踪器应用程序,我有一个实体,其中包含所有练习,另一个实体可以保存锻炼。我已经建立了两者之间的多对多关系,因为锻炼可以有很多锻炼,锻炼可以有很多锻炼。我已经将我的实体分类,并且我已经获得了这两个变量......

// Workout Entity...
@NSManaged public var exercises: NSSet?

// Exercises Entity...
@NSManaged public var workouts: NSSet?

我对如何向他们写数据感到困惑。我已经设置了一个包含所有练习的tableview,当用户选择一个时,它会显示一个复选标记。但我也希望将它保存到关系中。因此,当我稍后查询数据以进行锻炼时,我希望它向我展示该锻炼的所有相关练习。非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

应该很容易。 我想你有一个函数可以返回所有选择锻炼,我称之为selectedExercises()你需要将每个锻炼属性与锻炼属性连接起来,当然还要将锻炼属性与每个锻炼联系起来 这样的事情应该适合你:

let context = ...// your context

guard let workout = NSEntityDescription.insertNewObject(forEntityName: "Workout", into: context) as? Workout else {
    fatalError()
}

let exercises = selectedExercises() //func returning an NSSet
let workoutsSet = NSSet(object: workout)

for exercise in exercises {
    guard let exercise = exercise as? Exercise else { fatalError() }
    exercise.workouts = workoutsSet
}

workout.exercises = exercises

do {
    try context.save()
} catch {
    fatalError()
}

答案 1 :(得分:0)

假设您已经创建了锻炼/锻炼实体的实际实例,Xcode会为您生成添加和删除一个或多个相关对象的方法:

// MARK: Generated accessors for exercises
extension WorkoutEntity {

    @objc(addExercisesObject:)
    @NSManaged public func addToExercises(_ value: ManagedEmotionCategory)

    @objc(removeExercisesObject:)
    @NSManaged public func removeFromExercises(_ value: ManagedEmotionCategory)

    @objc(addExercises:)
    @NSManaged public func addToExercises(_ values: NSSet)

    @objc(removeExercises:)
    @NSManaged public func removeFromExercises(_ values: NSSet)

}

您可以在现有实例上使用它们:

workoutInstance.addToExercises(exerciseInstance)

反向关系由Core Data自动设置,因此:

exerciseInstance.workouts.contains(workoutInstance)

现在是true