首页 文章

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

提问于
浏览
0

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

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

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

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

2 回答

  • 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()
    }
    
  • 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 .

相关问题