gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:47:33 26 4
gpt4 key购买 nike

我正在尝试使用核心数据很长时间。
我阅读了很多有关此的教程,并提出了很多问题。

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

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

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

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

最佳答案

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

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

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

enter image description here

您熟悉使用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-many倒数与 to-one的关系,则只需使用 to-one即可。换句话说,它更易于使用:
[myPerson setValue:newCourse forKey:@"course"];

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

两者都能达成同一目标。

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

关于ios - 存储阵列属性中的核心数据或使用文件或关系实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34132781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com