核心数据存储arrays属性或与文件或关系实体一起工作

我正在努力工作很长一段时间的核心数据。
我读了很多关于这个的教程,我问了很多问题。

最后我开始研究核心数据
通过本指南: www.appcoda.com/introduction-to-core-data/

而现在我卡住了!
我想创build这种属性,数组。
有人告诉我,这是一个不好的方法来存储有关属性的数组。
这些工作与一个关系。

但是这里的问题。
如果你看指南,它不会创build文件(类)实体
和所有其他指南。 是的,创build文件,所以他们没有帮助我,因为我没有我的实体文件。

有没有办法创build这样的关系行为像一个属性数组,而不必我做文件创build实体?
因为我的项目已经很大了。

人们不build议使用数组作为CoreData实体的属性的原因是:数组必须转换为原始数据才能将其存储到persistentStore中,然后在从存储中读取对象时必须将其转换回来。 这有可能会变得缓慢,原始数据可能变得“大”。 重要的是,因为属性是以原始数据存储的,所以不能使用依赖于数组属性内容的谓词来获取存储对象的一个​​子集。 所以举个例子,你不能(容易地)获取“只有数组只有一个成员的对象”。

所以,人们推荐使用一种关系。 我强烈build议你创build子类; 如果你这样做会让你的生活变得如此轻松。 但是可以不使用子类来使用关系。 假设你有一个Person实体(带有namedateOfBirth属性)和一个Course实体(只带有一个name属性)。

假设每个Person只能参加一个Course ,但每个Course都可以有几个人参加。 您可以创build一对一的关系,并将其命名为attendees 。 相反的关系将是to-one名为类似的事情。 模型将如下所示:

在这里输入图像说明

您熟悉使用valueForKeysetValue:forKey:来访问属性值,例如。 对于一个string属性:

 // Get... NSString *myPersonName = [myPerson valueForKey:@"name"]; // Set... [myPerson setValue:@"John Doe" forKey:@"name"]; 

使用相同的方法获取/设置关系。 对于to-one关系,你得到/设置的值将是一个NSManagedObject

 // Get... NSManagedObject *personCourse = [myPerson valueForKey:@"course"]; // Set... [myPerson setValue:myCourse forKey:@"course"]; 

对于to-many关系,事情会稍微复杂一些。 由于Course可能有很多attendees ,因此您获得/设置的值是NSSet

 // Get... NSSet *myCourseAttendees = [myCourse valueForKey:@"attendees"]; for (NSManagedObject *person in myCourseAttendees) { NSLog(@"Attendee's name is %@", [person valueForKey:@"name"]; } // Set... NSSet *newAttendees = [NSSet setWithObjects:newPerson1, newPerson2, nil]; [myCourse setValue:newAttendees forKey:@"attendees"]; 

这一切都很好,但有时你只想添加/删除一个与会者:

 NSMutableSet *attendees = [myCourse mutableSetValueForKey:@"attendees"]; [attendees removeObject:myPerson]; [attendees addObject:myNewPerson]; 

所以,pipe理to-one关系要比to-many要容易得多。 这里有一个好消息:如果你的关系反过来,每当你修改它时,CoreData会自动更新你的反向关系。 所以,如果你有一个to-many关系,只需使用to-one 。 换句话说,它更容易使用:

 [myPerson setValue:newCourse forKey:@"course"]; 

比:

 NSMutableSet *attendees = [newCourse mutableSetValueForKey:@"attendees"]; [attendees addObject:myPerson]; 

两者都达到同样的目的。

现在,正如其他人在别处指出的那样,你实际上可能希望一个Person能够参加许多不同的Courses 。 在这种情况下,关系和它的逆将是to-many ,并且你使用可变集合方法被卡住了。