我是核心数据的新手,并尝试使用核心数据创建一个简单的应用程序。我目前正致力于将应用程序保存在多对多关系中,有几个问题和教程,但我仍感到困惑。
我有两个实体人和 contactNumbers ,我从地址簿中获取人及其联系电话,人 A 有手机号码, iphone号码,家庭,工作,其他......创造了许多关系。
在我的代码中,我没有子类化任何实体,是否有必要将实体子类化以保存关系中的数据?我问这个是因为我已经读过,没有必要直接使用NSManagedObject类来完成这项工作。
我想要的只是在人员实体中保存 A 名字,姓氏及 contactNumbers实体中的联系人号码。如何使用核心数据将数据保存为多对多关系?
请求我不要参考其他stackoverflow问题,raywenderlich教程,应用程序代码博客教程等。
请提供一个清晰易懂的代码,其中包含处理这种情况的概念。非常感谢。
这是我的模特
如果我这样做
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"];
它的工作正常,但数据如何在两个实体中相互关联?
答案 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,包括所有关系。它还将自动处理添加/删除新关系对象。没有它,我自己也不会想象再次手动做东西。祝你好运!