如何将核心数据(多对多)保存到自定义联接表中,而不使用唯一的谓词ManagedObjectID(Swift)?

如何将核心数据(多对多)保存到自定义联接表中,而不使用唯一的谓词ManagedObjectID(Swift)?,swift,core-data,many-to-many,nspredicate,nsmanagedobject,Swift,Core Data,Many To Many,Nspredicate,Nsmanagedobject,我将非常感谢任何帮助。如果没有唯一标识符作为谓词,如何将实例保存到联接表?是否可以使用托管对象id检查该项是否已存在 我正在用不同的锻炼计划构建一个应用程序。每个计划包含许多练习,一个练习可以属于许多计划。我已经构建了数据模型,以包含一个自定义联接表,这样我就可以从一个计划中查询练习的完成状态。 我从一个json文件中获取数据,并希望将其保存到核心数据中。我能够正确地保存我的CoreXercise和CorePlan表,但是我很难理解如何在中间联接表中保存对象的实例,因为我不确定要使用哪个谓词。

我将非常感谢任何帮助。如果没有唯一标识符作为谓词,如何将实例保存到联接表?是否可以使用托管对象id检查该项是否已存在

我正在用不同的锻炼计划构建一个应用程序。每个计划包含许多练习,一个练习可以属于许多计划。我已经构建了数据模型,以包含一个自定义联接表,这样我就可以从一个计划中查询练习的完成状态。

我从一个json文件中获取数据,并希望将其保存到核心数据中。我能够正确地保存我的CoreXercise和CorePlan表,但是我很难理解如何在中间联接表中保存对象的实例,因为我不确定要使用哪个谓词。 我编写了一个类函数来检查实例是否存在,如果不存在则保存它

class CoreExercisePlan: NSManagedObject {
  class func coreExercisesForExercisePlan(exerciseInfo: Exercise, planName: String, inManagedObjectContext context: NSManagedObjectContext) -> CoreExercisePlan? {

    let request = NSFetchRequest(entityName: "CoreExercisePlan")
    request.predicate = NSPredicate() // Search for ObjectID here? / How?

    if let exercisePlan = (try? context.executeFetchRequest(request))?.first as? CoreExercisePlan {
        print("we have this exercise plan already saved")
        return exercisePlan

    } else if let exercisePlan = NSEntityDescription.insertNewObjectForEntityForName("CoreExercisePlan", inManagedObjectContext: context) as? CoreExercisePlan {
        exercisePlan.status = 0
        exercisePlan.progress = 0
        print("we are creating new object")
        return exercisePlan
    }
    return nil
}


private func updateDatabaseWithExercisePlans(){
    managedObjectContext?.performBlock {

        // Array of exercises for each plan:
        let coffeePlanExercises = self.coffeeExercises 
        let subwayPlanExercises = self.subwayExercises

        for exercise in coffeePlanExercises {
            _ = CoreExercisePlan.coreExercisesForExercisePlan(exercise, planName: "coffee", inManagedObjectContext: self.managedObjectContext!)
        }

        for exercise in subwayPlanExercises {
            _ = CoreExercisePlan.coreExercisesForExercisePlan(exercise, planName: "subway", inManagedObjectContext: self.managedObjectContext!)
        }

        do {
            try self.managedObjectContext?.save()
        } catch let error {
            print("printing error here: \(error)")
        }
    }
}

有没有办法在联接表中获取实例的objectID,并将其用作谓词?谢谢

当你加载核心练习和核心计划时,你如何唯一地识别它们?您可以使用相同的标准来唯一标识CoreExercisePlans(即,您在特定CorePlan中获取特定CoreExercisePlan的CoreExercisePlan)。@pbasdf感谢您的评论。我通过它们名称上的谓词来识别它们:request.predicate=NSPredicate(格式:“name=%@”,exercise.name)。我可以在ExercisePlan的谓词中搜索相同的练习名称吗?类似这样的内容:NSPredicate(格式:“exercise.name=%@和plan.name=%@”,exercise.name,planName)谢谢@pbasdf。我得到一个:“NSInvalidArgumentException”,原因:“无法解析格式字符串。”“exercise.name=%@和plan.name。我认为谓词的第一部分可以引用相关对象的属性名?仅供参考,我收到的练习名和计划名都是字符串。糟糕的是,我输入错了。现在有一个理由:“NSInvalidArgumentException”,理由是:“这里不允许使用多个密钥”。我将对此进行更多的研究。非常感谢@pbasdf当您加载核心练习和核心计划时,您如何唯一地识别它们?您可以使用相同的标准来唯一标识CoreExercisePlans(即,您在特定CorePlan中获取特定CoreExercisePlan的CoreExercisePlan)。@pbasdf感谢您的评论。我通过它们名称上的谓词来识别它们:request.predicate=NSPredicate(格式:“name=%@”,exercise.name)。我可以在ExercisePlan的谓词中搜索相同的练习名称吗?类似这样的内容:NSPredicate(格式:“exercise.name=%@和plan.name=%@”,exercise.name,planName)谢谢@pbasdf。我得到一个:“NSInvalidArgumentException”,原因:“无法解析格式字符串。”“exercise.name=%@和plan.name。我认为谓词的第一部分可以引用相关对象的属性名?仅供参考,我收到的练习名和计划名都是字符串。糟糕的是,我输入错了。现在有一个理由:“NSInvalidArgumentException”,理由是:“这里不允许使用多个密钥”。我将对此进行更多的研究。非常感谢@pbasdf