在Core Data中复制实体

时间:2010-12-02 13:34:27

标签: iphone objective-c core-data ios

我有几个核心数据实体......学生和考试。

现在,考试最初只是每个考试的一个对象 - 数学考试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:也许我会重组......

4 个答案:

答案 0 :(得分:2)

考试不应该有hasTaken属性。在现实世界中考虑一下。考试不知道是谁采取了它,因为很多人都可以接受它。那么,参加考试的实例应该是模型中的一流概念。

考虑一下:

Exam has many TakenExams, TakenExams belongs to Student http://yuml.me/6627495d

现在,参加考试的概念是一个真实的对象,您也可以对关联元数据进行建模,例如dateTakenscore等。

另请记住,Core Data希望您也可以设置所有反向关联。

答案 1 :(得分:1)

您通常不复制实体。 (我不确定如果你在copy上拨打NSManagedObject会发生什么......据我所知,文档中没有解释这一点。专家可以纠正我。)

只需创建另一个实体,或者编写一个能够做到这一点的方法。

我认为另一种方法是在ExamStudent之间建立多对多关系:

  • 在名为ExamstudentsToTakeThisExam的{​​{1}}中创建关系。
  • 在名为studentsWhoTookThisExamStudent的{​​{1}}中创建关系。

并相应地设置反向关系。

答案 2 :(得分:1)

在这种情况下,你真的不想复制考试。你最终会得到很多同名的考试,这些考试之间没有任何关系,然后你会被迫按照他们的名字将它们组合在一起(如果你愿意)。

我建议使用一个新实体(可能是“ExamSitting”?)代表Student坐在Exam。然后,您可以从StudentExamSitting进行多对多,从ExamExamSitting进行多对多。这样,您就可以根据需要在ExamSitting上拥有尽可能多的属性(hasTakengrade等等。)

修改

好的,鉴于你的澄清,我有一两点要补充(虽然它们可能不是你想要的)。我了解您是从具有特定结构的文件加载的,但这并不一定要指示您的结构。

根据您现在描述的XML文件,我仍然会使用Exam - Student - ExamSitting模型。如果我要实现它,我将加载所有Student,然后,对于Exams文件中的每个记录,我将创建一个Exam对象,然后创建一些ExamSitting 1}}个对象,每个Student一个符合记录中定义的条件。如上所述,这使您可以存储有关每个事件的更多信息,例如marktakenDate等。

如果您确定不需要以此粒度存储其他信息,则可以创建一个多对多关系studentsTakingExam。当您通过查询加载的Student实体加载每个检查记录时,可以填充此内容。

答案 3 :(得分:1)

如果您的建模是正确的,我不会争辩(如您的要求)。复制实体的过程通常非常复杂,因为除了属性之外,您还需要处理实体的关系并复制它们。我不能在这里发布大量的源代码来展示如何实现这一点,但是,我可以向您指出一本书,其中详细描述了这个问题,并提供了您需要的所有源代码。这本书来自Marcus Zarra,“核心数据Apple在Mac OS X上保存数据的API”,作者是“实用程序员”。