使用关系理解核心数据

时间:2013-03-21 10:00:51

标签: objective-c sqlite core-data entity-relationship

我使用 CoreData 关系误解了。

我记得从我的sql的时间(很久以前......)我必须添加 ID 到每个表格,这将是条目这使表之间的关系。

在我的CoreData(实体)中我的表格的概述下面。

Epro_Sheet是我的主表,其他人必须与那个相关。

我想做的是:

  • 用户填写具有自己的实体EPro_CompanyViewController
  • 的UIViewController(EPro_Company)上的字段
  • 然后当他按下一个 - 创建EPro_Sheet,增加idSheet并填充其他条目 - 而且EPro_Company填充了EPro_CompanyViewController的字段文本。
  • 然后用户将填写EPro_DaFroidViewController的字段,然后当他按下它时填充实体EPro_DaFroid获取当前EPro_Sheet的当前ID并将其设置为EPro_DaFroid ......
  • 等...
  • 将有一个UIViewController(历史记录),允许用户检索特定日期的所有信息,以编辑或显示它。

你能帮我解决怎么做的事吗?关系或根本没有...如果有关系我怎样才能使用NSPredicateFormat检索信息:从@"日期中检索我的所有信息....&#34 ;;

非常感谢你的帮助!

enter image description here

1 个答案:

答案 0 :(得分:1)

首先,您必须了解核心数据不是关系数据库,主键等概念不存在。它留给你实施。有关这方面的更多详情,请访问:

Core-data vs RDBMS

在这里

The differences between Core Data and a Database

如果您想在核心数据中实现关系,则必须在核心数据模型中创建关系。想象一下,你有这样的关系:

学生< - >>节

即一个学生属于一个部分,一个部分可以有许多学生。然后在您的核心数据模型中,您可以定义从一个对一的学生到一个部分的一个关系(比如oneSection)和另一个关系(比如manyStudents),从一个部分到另一个部分 - 太多。然后将关系设置为彼此的反比关系。

虽然我们将此声明为关系,但它几乎充当托管对象的属性。

因此,如果您有一个名为studObj1studObj2Student实体)的托管对象,那么您可以将这样的关系设置为一个section对象(sectionObj):

(假设您将创建一个托管对象子类)

Student *studObj1= <create object>
Student *studObj2= <create object>

Section *sectionObj = <create object>

//set one-to-one relationship
studObj1.oneSection = sectionObj;
studObj2.oneSection = sectionObj;

//set one-to-many relationship;

NSSet *studSet = [NSSet setWithObjects:studObj1,studObj2,nil];
sectionObj.manyStudents = studSet;

关于谓词,您可以直接使用关系的属性: 即。如果你想根据部分获得学生,你可以创建如下的谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"oneSection.name like 'MainSection'"];