首页 > 解决方案 > CoreData 保存/获取多对多关系

问题描述

我想实现简单的东西,但我只是觉得我错过了 coreData 的一些功能。所以我做了一个 createSession 函数,它的工作是创建一个会话,并带有一些练习。一个练习应该能够连接到多个会话,反之亦然。所以我做了以下数据模型: 在此处输入图像描述

从这里开始,我做了ExerciseMO和SessionMO:

class SessionMO: NSManagedObject {

@NSManaged var name: String?
@NSManaged var exercises: NSSet

}

class ExerciseMO: NSManagedObject {

@NSManaged var name: String
@NSManaged var mainMuscle: Int
@NSManaged var difficulty: Bool
@NSManaged var session: SessionMO

}

我的保存功能:

func createSession(name: String, exercisesConnect: [ExerciseMO]){

    var newExercises: NSSet = []

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    let managedContext = appDelegate.persistentContainer.viewContext

    for exercise in exercisesConnect {

        let newExercise = exercise as ExerciseMO
        let session = NSEntityDescription.insertNewObject(forEntityName: "Sessions", into: managedContext) as! SessionMO
        session.name = name
        newExercise.sessions?.adding(session)

        print("\(newExercise.name!) is saved under session named: \(session.name!)")
    }

    do {
        try! managedContext.save()
        print("Session '\(name)' is saved successfully.")
    }
}

它有效,或者如果有效,则为 idk。因为当我尝试获取会话并连接练习时,它总是给我 0。

我的获取功能:

func findSession(name: String) {

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    let managedContext = appDelegate.persistentContainer.viewContext
    let sessionEntity = NSEntityDescription.entity(forEntityName: "Sessions", in: managedContext)!

    let sessionFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Sessions")
    sessionFetch.fetchLimit = 1
    sessionFetch.predicate = NSPredicate(format: "name = %@", name)

    print("Here 1.")

    do {

        print("Here 2.")
        let sessions = try! managedContext.fetch(sessionFetch)
        print("Here 3.")
        for session in sessions as! [SessionMO] {
            print("Here 4.")
            print(session.name!)
            if let exercises = session.exercises {
                print("Here 5.")
                print(exercises.count)

            }
        }
    }
}

打印输出示例:

保存打印:

获取打印:

因此,如果有人能以某种方式或任何有帮助的方式指出我,将不胜感激。谢谢!

标签: iosswiftcore-datansmanagedobjectnsmanagedobjectcontext

解决方案


推荐阅读