需要有关核心数据的帮助

时间:2013-03-30 20:10:38

标签: ios core-data

我是核心数据的新手,并尝试使用核心数据创建一个简单的应用程序。我目前正致力于将应用程序保存在多对多关系中,有几个问题和教程,但我仍感到困惑。

我有两个实体 contactNumbers ,我从地址簿中获取人及其联系电话,人 A 有手机号码, iphone号码,家庭,工作,其他......创造了许多关系。

在我的代码中,我没有子类化任何实体,是否有必要将实体子类化以保存关系中的数据?我问这个是因为我已经读过,没有必要直接使用NSManagedObject类来完成这项工作。

我想要的只是在人员实体中保存 A 名字,姓氏及 contactNumbers实体中的联系人号码。如何使用核心数据将数据保存为多对多关系?

请求我不要参考其他stackoverflow问题,raywenderlich教程,应用程序代码博客教程等。

请提供一个清晰易懂的代码,其中包含处理这种情况的概念。非常感谢。

这是我的模特

This is my model

如果我这样做

NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"person" inManagedObjectContext:self.managedObjectContext];

[person setValue:@"first name A" forKey:@"firstName"];
[person setValue:@"last name B" forKey:@"lastName"];
[person setValue:@"123" forKey:@"mobile"];

我收到了这个错误

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSManagedObject 0x82abcc0> setValue:forUndefinedKey:]: the entity Person is not key value coding-compliant for the key "mobile".

如果我这样做

NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
    [person setValue:@"first name A" forKey:@"firstName"];
    [person setValue:@"last name B" forKey:@"lastName"];    

    NSManagedObject *contactNumber = [NSEntityDescription insertNewObjectForEntityForName:@"ContactNumber" inManagedObjectContext:self.managedObjectContext];
    [contactNumber setValue:@"123" forKey:@"home"];
    [contactNumber setValue:@"456" forKey:@"iPhone"];
    [contactNumber setValue:@"789" forKey:@"mobile"];
    [contactNumber setValue:@"111" forKey:@"work"];
    [contactNumber setValue:@"112" forKey:@"other"];

它的工作正常,但数据如何在两个实体中相互关联?

2 个答案:

答案 0 :(得分:3)

您不需要继承。

你只需要关系。

在名为Person的{​​{1}}上指向contactNumbers实体的关系,以及ContactNumber实体上名为ContactNumber的匹配关系指向person

contactNumber关系应该是一对多(因为一个人有很多联系人),而ContactNumber回到Person的关系应该是一对一的(因为每个联系人)条目只出现在一个人身上。)

当你获得一个Person实体时,你将能够从contactNumbers属性中获取一组ContactNumber对象,然后查看集合中的元素。或者,您可以搜索ContactNumber ID与人物关系匹配的person实体返回Person

跟进:您的第一个代码不起作用,因为您无法通过集合引用单个实例。

您的第二部分代码很好,只需添加一行

即可
contactNumber.person = person;

然后,您可以随时通过以下方式访问某人的联系人:

NSSet *contacts = person.contactNumbers;

获取您想要的联系号码。如果没有一些非常棘手的keypath内容,你不能直接从一个人转到一个联系人。

我非常强烈建议您在设置模型后使用Mogenerator生成数据对象,这样可以更清楚地了解如何使用它。对核心数据使用setKey机制是UTTERLY INSANE。

答案 1 :(得分:1)

您根本不需要进行任何子类化来读取和写入核心数据关系(或任何其他值)。在Core Data中,关系表示为NSMutableSet。下面是一些示例代码,向您展示如何检索此集并对其进行修改:

// Assuming myPerson is an NSManagedObject instance of the Person entity
NSMutableSet *contactNumbers = [myPerson mutableSetValueForKey:@"contactNumbers"];

// Add numbers normally by calling the set's addObject property
[contactNumbers addObject:myNewNumber];
//etc.

如果您还没有这样做,我还强烈建议您查看Sensible TableView框架。该框架将自动为您的Core Data实体生成UI,包括所有关系。它还将自动处理添加/删除新关系对象。没有它,我自己也不会想象再次手动做东西。祝你好运!