Ios 存储阵列中的核心数据属性或与文件或关系实体一起使用

Ios 存储阵列中的核心数据属性或与文件或关系实体一起使用,ios,objective-c,core-data,Ios,Objective C,Core Data,我一直在努力处理核心数据。 我读了很多关于这个的教程,问了很多问题 最后,我开始研究核心数据 通过本指南:www.appcoda.com/core data introduction/ 现在我被卡住了 我想创建属性的类型,数组。 有人告诉我,这不是存储属性数组的好方法。 这些都与关系有关 但问题就在这里。 如果您查看指南,它不会创建文件(类)实体 和所有其他向导。是的,正在创建文件,因此它们对我帮助不大,因为我没有实体文件 有没有一种方法可以创建类似于一个属性的数组的关系,而无需创建文件创建实体

我一直在努力处理核心数据。
我读了很多关于这个的教程,问了很多问题

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

现在我被卡住了
我想创建属性的类型,数组。
有人告诉我,这不是存储属性数组的好方法。
这些都与关系有关

但问题就在这里。
如果您查看指南,它不会创建文件(类)实体
和所有其他向导。是的,正在创建文件,因此它们对我帮助不大,因为我没有实体文件

有没有一种方法可以创建类似于一个属性的数组的关系,而无需创建文件创建实体?

因为我的项目已经很大了。

人们不建议使用数组作为CoreData实体的属性的原因是:数组必须转换为原始数据以存储到persistentStore,然后在从存储读取对象时必须转换回。这有可能是缓慢的,原始数据可能会变得“大”。重要的是,由于属性存储为原始数据,因此无法使用依赖于数组属性内容的谓词获取存储对象的子集。例如,您无法(轻松地)获取“仅数组只有1个成员的对象”

因此,人们建议使用关系。我强烈建议您创建子类;如果你这样做的话,你的生活会轻松得多。但是,不需要子类化就可以使用关系。假设您有一个
个人
实体(具有
姓名
出生日期
属性)和一个
课程
实体(仅具有
姓名
属性)

假设每个
只能参加一个
课程
,但每个
课程
可以有几个人参加。您将创建一个从
课程
个人
的多对多关系,并将其命名为
与会者
。相反的关系将是
到一个
命名为
课程
。因此,模型将如下所示:

您熟悉使用
valueForKey
setValue:forKey:
访问属性值,例如,对于字符串属性:

// Get...
NSString *myPersonName = [myPerson valueForKey:@"name"];
// Set...
[myPerson setValue:@"John Doe" forKey:@"name"];
使用相同的方法获取/设置关系。对于一个
到一的关系,您得到/设置的值将是一个
NSManagedObject

// Get...
NSManagedObject *personCourse = [myPerson valueForKey:@"course"];
// Set...
[myPerson setValue:myCourse forKey:@"course"];
对于许多关系而言,事情变得稍微复杂一些。因为一个
课程
可以有许多
参与者
,所以您得到/设置的值是一个
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];
因此,管理
对一
关系要比管理
对多
关系容易得多。好消息是:如果你的关系有反向关系,每当你修改它时,CoreData会自动为你更新反向关系。因此,如果你有一个
对多
的关系,与
对一
的关系相反,只需使用
对一
。换句话说,它更容易使用:

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

两者都实现了同样的目标


现在,正如其他人在其他地方指出的那样,实际上你可能希望一个
能够参加许多不同的
课程
。在这种情况下,关系和它的逆关系都将是
到many
,并且您一直在使用可变集合方法。

我真的不理解这个问题,即:什么是“数组属性”?例如,我有一个名为person的实体,我希望这个人是很多孩子问题是我有很多人,所以我必须在entity上创建一种数组你只需在Xcode中创建“NSManagedObject子类”类文件:在Core Data model inspector中选择一个或多个实体,然后选择“编辑器->创建NSManagedObject子类…”正如Martin R所说,您可以创建NSManagedObject的子类,即..Person,然后创建Person的实例,如Person*person1、Person*person2等,或者您可以在循环中迭代Person。这样做将允许搜索Person实体的关系和属性?您可以将CoreData与NSManagedObjects一起直接用于所有回迁,并通过键值获取属性。如果你想让一个人有多个孩子,你必须将其建模为一对多关系。因此,您将获得实体人上关键儿童的NSSet。哇,谢谢,我没想到有人会像您一样帮助我,我会尝试一下,再次感谢!我不知道该如何感谢你。它工作得很好!。我终于知道如何处理这段关系了。谢谢谢谢谢谢!!
NSMutableSet *attendees = [newCourse mutableSetValueForKey:@"attendees"];
[attendees addObject:myPerson];