我有几个核心数据实体......学生和考试。
现在,考试最初只是每个考试的一个对象 - 数学考试3,英语考试2等。
我的数据模型中的学生和考试之间存在关系(学生可以参加多个考试)。但最初,考试只是自由浮动,而不是任何学生。
我如何复制其中一项考试并将其附在学生身上?
如果我这样做:
[student addExamsObject:examObject];
...然后我认为它只是将原始考试引用给学生,而不是复制。
我需要一份副本,因为考试有一个布尔'hasTaken',当学生参加考试时为YES。但是,如果我现在设置它,它将使所有参加该考试的学生都能接受它。
澄清:我宁愿不重组我的模型。数据来自几个xml文件,分别用于学生和考试,这些文件被解析到Core Data存储中。例如,Exam对象可能如下所示:
name:Maths 5
class-id:12
year-id:4
student-id:0
..与Student对象看起来像
name: Dave
class-id:12
year=id:4
student-id:222
各种规则旨在指导哪些考试附加到哪些学生...例如,如果所有考试的ID都是0,则所有学生都参加考试。如果class-id和year-id匹配,且student-id为0,则考试将添加到具有相同班级和年份的学生中。如果学生ids匹配,那么只有该学生参加考试。等等 我无法改变从服务器输出xml的方式。
另一个问题是考试与问题实体有太多关系......换句话说,考试中的问题。而且我必须存储每个学生在考试中提出的问题的答案。
编辑:我希望人们会尝试回答我的问题,而不是告诉我重组我的整个计划。有理由说明数据模型的结构是这样的。
Edit2:也许我会重组......
答案 0 :(得分:2)
考试不应该有hasTaken
属性。在现实世界中考虑一下。考试不知道是谁采取了它,因为很多人都可以接受它。那么,参加考试的实例应该是模型中的一流概念。
考虑一下:
Exam has many TakenExams, TakenExams belongs to Student http://yuml.me/6627495d
现在,参加考试的概念是一个真实的对象,您也可以对关联元数据进行建模,例如dateTaken
,score
等。
另请记住,Core Data希望您也可以设置所有反向关联。
答案 1 :(得分:1)
您通常不复制实体。 (我不确定如果你在copy
上拨打NSManagedObject
会发生什么......据我所知,文档中没有解释这一点。专家可以纠正我。)
只需创建另一个实体,或者编写一个能够做到这一点的方法。
我认为另一种方法是在Exam
和Student
之间建立多对多关系:
Exam
和studentsToTakeThisExam
的{{1}}中创建关系。studentsWhoTookThisExam
和Student
的{{1}}中创建关系。并相应地设置反向关系。
答案 2 :(得分:1)
在这种情况下,你真的不想复制考试。你最终会得到很多同名的考试,这些考试之间没有任何关系,然后你会被迫按照他们的名字将它们组合在一起(如果你愿意)。
我建议使用一个新实体(可能是“ExamSitting
”?)代表Student
坐在Exam
。然后,您可以从Student
到ExamSitting
进行多对多,从Exam
到ExamSitting
进行多对多。这样,您就可以根据需要在ExamSitting
上拥有尽可能多的属性(hasTaken
,grade
等等。)
修改强>
好的,鉴于你的澄清,我有一两点要补充(虽然它们可能不是你想要的)。我了解您是从具有特定结构的文件加载的,但这并不一定要指示您的结构。
根据您现在描述的XML文件,我仍然会使用Exam
- Student
- ExamSitting
模型。如果我要实现它,我将加载所有Student
,然后,对于Exams文件中的每个记录,我将创建一个Exam
对象,然后创建一些ExamSitting
1}}个对象,每个Student
一个符合记录中定义的条件。如上所述,这使您可以存储有关每个事件的更多信息,例如mark
,takenDate
等。
如果您确定不需要以此粒度存储其他信息,则可以创建一个多对多关系studentsTakingExam
。当您通过查询加载的Student
实体加载每个检查记录时,可以填充此内容。
答案 3 :(得分:1)
如果您的建模是正确的,我不会争辩(如您的要求)。复制实体的过程通常非常复杂,因为除了属性之外,您还需要处理实体的关系并复制它们。我不能在这里发布大量的源代码来展示如何实现这一点,但是,我可以向您指出一本书,其中详细描述了这个问题,并提供了您需要的所有源代码。这本书来自Marcus Zarra,“核心数据Apple在Mac OS X上保存数据的API”,作者是“实用程序员”。