我有几个核心数据实体。学生和考试。
现在,最初的考试只是一个考试对象--数学考试3,英语考试2等等。
在我的数据模型中,学生和考试之间有一种关系(一个学生可以有几个考试)。但一开始,考试是免费的,不附加于任何学生。
我如何制作一份考试的副本,并把它附在学生身上?
如果我做这样的事:
[student addExamsObject:examObject];...then我认为它只是简单地引用了最初的考试,而不是复制一份。
我需要一份副本,因为考试中有一个布尔级的“匆匆”,当学生参加考试时,这是肯定的。但是,如果我现在设置它,它将使它看起来像是所有的学生参加了那次考试。
澄清:我宁愿不重组我的模式。这些数据是从几个xml文件中提取的,每个文件都是为学生和考试准备的,这些文件被解析到Core数据存储中。例如,一个考试对象可能如下所示:
name:Maths 5
class-id:12
year-id:4
student-id:0..with的学生对象看起来像
name: Dave
class-id:12
year=id:4
student-id:222各种规则都是为了指导哪些考试被附加在哪些学生身上.例如,如果所有考试的if都是0,那么所有的学生都参加考试。如果班级id和学年id匹配,而学生id是0,那么考试将被添加到同一个班级和年份的学生中。如果学生证符合,那么只有那个学生参加考试。等等,我不能改变从服务器输出xml的方式。
另一个问题是考试与问题实体有太多的关系.换句话说,考试中的问题。我必须保存每个学生在考试中提出的问题的答案。
编辑:我希望人们回答我的问题,而不是告诉我重组我的整个程序。数据模型之所以像现在这样构造是有原因的。
Edit2:也许我会重组..。
发布于 2010-12-02 14:19:18
考试不应该有hasTaken属性。在现实世界里好好想想。考试不知道谁参加了考试,因为很多人都可以参加考试。那么,参加考试的例子应该是你的模型中的头等概念.
考虑到这一点:
考试有很多TakenExams,TakenExams属于学生TakenExams
现在,参加考试的概念是一个真实的对象,然后您也可以建模集合元数据,例如dateTaken、score等等。
还请记住,Core Data要求您也设置所有逆关联。
发布于 2010-12-02 14:00:15
你通常不会复制一个实体。(我不知道如果你用copy在NSManagedObject上打电话会发生什么.据我所知,这在文档中没有解释。专家可以纠正我。)
只需创建另一个实体,或编写一个方法就可以做到这一点。
我认为另一种方法是在Exam和Student之间建立多到多的关系。
Exam中创建名为studentsToTakeThisExam和studentsWhoTookThisExam的关系。Student中创建名为examsToTake和examsAlreadyTaken的关系。并建立了相应的逆关系。
发布于 2010-12-02 14:08:16
在这种情况下,你真的不想复制考试。你最终会有很多没有关系的同名考试,然后你会被迫(如果你想的话)按他们的名字分组。
我推荐一个新的实体(也许是"ExamSitting"?)它表示坐在一个Student上的Exam。然后,您可以从Student到ExamSitting再到多,从Exam到ExamSitting可以多到多。这使您能够在ExamSitting上拥有任意数量的属性(hasTaken、grade等)。
编辑
好吧,考虑到你的澄清,我还有一两点要补充(尽管它们可能不是你想要的)。我知道您是从具有特定结构的文件中加载的,但这并不一定需要指定您的结构。
使用您现在描述的XML文件,我仍然会使用Exam - Student - ExamSitting模型。如果要实现它,我将加载所有的Student,然后,对于考试文件中的每一项记录,我将创建一个Exam对象,然后创建多个ExamSitting对象,每个Student都符合记录中定义的条件。如前所述,这使您能够存储有关每个事件的更多信息,如mark、takenDate等。
如果您确信不需要能够在此粒度上存储其他信息,则只需创建一个to -多关系studentsTakingExam即可。在加载每个考试记录时,可以通过查询加载的Student实体来填充这些内容。
https://stackoverflow.com/questions/4335560
复制相似问题