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

Posted

技术标签:

【中文标题】存储阵列属性中的核心数据或使用文件或关系实体【英文标题】:core data in storage array attribute or work with files or relationship entities 【发布时间】:2015-12-07 11:44:33 【问题描述】:

我正在尝试长时间处理核心数据。 我阅读了很多关于这方面的教程,并提出了很多问题。

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

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

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

有没有一种方法可以创建类似于数组与一个属性的关系,而无需我创建文件创建实体? 因为我的项目已经很大了。

【问题讨论】:

我真的不明白那个问题。即:什么是“数组属性”? 例如,我有一个名为 person 的实体,我希望这个人是多个孩子 问题是我有很多人,所以我必须在实体上创建一种数组跨度> 您可以在Xcode中简单地创建“NSManagedObject子类”类文件:在Core Data模型检查器中选择一个或多个实体并选择“Editor->Create NSManagedObject Subclass ...” 正如 Martin R 所说,您可以创建 NSManagedObject 的子类,即 Person,然后创建 Person *person1、Person *person2 等 Person 的实例,或者您可以循环遍历 Person。这样做将允许搜索 Person Entity 的关系和属性。 据我了解,您不希望代码中有任何 entityClasses(又名 NSManagedObject 的子类)?您可以直接将 CoreData 与 NSManagedObjects 一起用于所有提取并通过键值获取属性。如果您希望一个人有很多孩子,您必须将其建模为一对多关系。结果,您将获得实体 person 上关键子项的 NSSet。 【参考方案1】:

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

因此,人们建议使用关系。我强烈建议您创建子类;如果你这样做,它会让你的生活变得更轻松。但是可以使用关系没有子类化。假设您有一个Person 实体(具有namedateOfBirth 属性)和一个Course 实体(仅具有name 属性)。

假设每个Person 只能参加一个Course,但每个Course 可以有几个人参加。您将创建从CoursePerson 的一对多关系,并将其命名为attendees。反向关系将是to-one,命名为course。因此,该模型将如下所示:

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

// 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];

因此,管理to-one 关系比to-many 容易得多。好消息是:如果你的关系有逆关系,无论何时修改它,CoreData 都会自动为你更新逆关系。因此,如果您有一个 to-manyto-one 逆关系,只需使用 to-one。换句话说,它更容易使用:

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

比:

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

两者都实现相同的目标。

现在,正如其他人在其他地方指出的那样,您实际上可能希望Person 能够参加许多不同的Courses。在这种情况下,关系及其逆关系都将是to-many,并且您无法使用可变集合方法。

【讨论】:

哇,谢谢你,没想到有人像你一样帮助我,我会试试的,再次感谢! 我不知道该怎么感谢你。它工作得很好!我终于知道如何处理这种关系了。谢谢谢谢谢谢!

以上是关于存储阵列属性中的核心数据或使用文件或关系实体的主要内容,如果未能解决你的问题,请参考以下文章

预填充核心数据存储:使用 JSON 属性列表还是 XML 文件?

关于两个实体中的关系

如何使用核心数据访问保存在不同视图控制器中的阵列?

EF 核心。两个实体(表)之间的多个一对一或零关系

使用 fetched 属性的核心数据跨存储查询

多对多关系核心数据