2014-02-25 67 views
0

我想学习如何使用核心数据,但我被困在创建两个实体之间的关系,我不知道我是否以错误的角度看这个,但基本上,我有两个实体:“Listas”和“Tarefas”。在我的xcdatamodeld中,我创建了一个对象之间的一对多关系,我只是不知道如何在添加“Tarefa”时设置正确的关系。使用核心数据创建一个实体关系

我的问题更加清晰,这里是什么,我有一个形象:

Core Data Relation

当添加一个“Tarefas”,反对我如何关联的,与通过“Listas”的对象?

谢谢!

+0

尝试为对象使用更好的命名约定。使用单数来命名实体,例如Lista,Tarefa(我不知道这些名称是否与Listas具有相同的含义?)。然后以类似的方式为您的关系命名,例如Lista.tarefas(To-Many),Tarefa.lista(To-One)。没有必要调用关系listaTarefas(这已经很明显,因为它是Lista的一个属性)。现在,当您创建新的Tarefa'newTarefa'时,只需设置newTarefa.lista = lista,假设lista是传递的对象。你不需要设置反比关系。 –

+0

当然,这假定你为你的实体创建NSManagedObject子类。 –

+0

感谢您的提示。 –

回答

3

它的工作原理与任何其他对象属性。

如果没有定制NSManagedObject子类,

Listas *myListas = // passed in 
Tarefas *newTarefas = [NSEntityDescription insertNewObjectForEntityForName:@"Tarefas" inManagedObjectContext:myManagedObjectContext]; 
[newTarefas setValue:myListas forKey:@"tarefaLista"]; 

如果定制NSManagedObject子类,

Listas *myListas = // passed in 
Tarefas *newTarefas = [NSEntityDescription insertNewObjectForEntityForName:@"Tarefas" inManagedObjectContext:myManagedObjectContext]; 
[newTarefas setTarefaLista:myListas]; 

请记住,因为你必须正确配置反向关系,你只需要在关系的一边进行分配。核心数据将确保另一方也被设置。如上所述,我只为tarefaList设置了一个值,但listaTarefa也获得了一个新值。

+0

非常感谢您提供清晰详尽的解释。 –

1

你可以去:

Listas* l = //Your passed Listas 
Terafas* t = //create your new Terafas 
t.terafaLista = l; 

它会更容易不打电话给你的实体复数形式(而不是Listas称之为Lista)。你的代码会更有意义。
正如@TomHarrington所提到的,您的反比关系将会自动保持。

+0

感谢您的回答。 –

0

我想,人们会在以后的SE这一点,所以为了以防万一,这是过滤基于两个对象之间的关系数据的代码。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", self.currentListas.listaTarefa]; 
    [fetchRequest setPredicate:predicate]; 

self.currentListas是segue传递的Lista对象。

相关问题