0

我正在尝试了解核心数据(对多)关系。在下面的代码中,我有两个实体

人员列表 <-->> 交易详情

NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *personDetails = [NSEntityDescription
                                  insertNewObjectForEntityForName:@"PeopleList"
                                  inManagedObjectContext:context];

[personDetails setValue:[person fullName] forKey:@"name"];

NSManagedObject *transactionDetails = [NSEntityDescription
                                       insertNewObjectForEntityForName:@"TransactionDetails"
                                       inManagedObjectContext:context];


[transactionDetails setValue:[NSNumber numberWithFloat:oweAmount] forKey:@"amount"];

NSError *error;
if (![context save:&error]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}

现在,此代码将一个新对象(行)插入到模型中。我感到困惑的是: 1. 我不必编写代码来关联两个实体(PeopleList 和 TransactionDetails)中的对象值吗?2. 如果我一次又一次地运行此代码,它只会继续在第一个实体(PeopleList)中添加相同的对象。如何写多对多关系?我从最后几个小时的阅读中得到的是我必须获取结果,搜索那个特定的对象,如果它存在,那么不要插入一个同名的新对象。但在那种情况下,它将如何关联这两个实体。

4

2 回答 2

0

就一对多关系而言,您的模型实体在模型编辑器中是否正确连接?您是否为实体生成了类文件?如果您可以用“是”回答这两个问题,则您可以像以前一样创建个人列表实体和详细信息实体,但您需要将详细信息添加到您的个人列表中。查看方法名称的类文件。

于 2012-09-05T18:39:18.483 回答
0

它不会,因为您没有在任何一个对象上设置关系。我看不到您在哪里设置新创建的 TransactionDetail 对象的 PeopleList 属性(对不起,我不知道您是如何在模型中命名属性的,所以我只是使用类名)。因此,在创建您的 transactionDetails 对象之后,您需要执行类似 transactionDetails.PeopleList = personDetails 的操作,并且这两个关系都将在此时设置;transactionDetails.PeopleList 属性将指向您的 personDetails 对象,而 personDetails.TransactionDetails 集将包含 transactionDetails。

您用来设置名称的人对象是什么?

另一方面,您可能需要考虑将所有这些东西移到 NSManagedObject 的子类中;为每个实体编写自己的超级简单的构造函数/初始化程序等。很多人从不这样做,最终在他们的控制器代码中乱扔了很多 CoreData 样板,这对我来说是个谜,因为这就是使用 CoreData 如此好的原因。

于 2012-09-05T19:42:25.340 回答