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