核心数据存储arrays属性或与文件或关系实体一起工作
我正在努力工作很长一段时间的核心数据。
我读了很多关于这个的教程,我问了很多问题。
最后我开始研究核心数据
通过本指南: www.appcoda.com/introduction-to-core-data/
而现在我卡住了!
我想创build这种属性,数组。
有人告诉我,这是一个不好的方法来存储有关属性的数组。
这些工作与一个关系。
但是这里的问题。
如果你看指南,它不会创build文件(类)实体
和所有其他指南。 是的,创build文件,所以他们没有帮助我,因为我没有我的实体文件。
有没有办法创build这样的关系行为像一个属性数组,而不必我做文件创build实体?
因为我的项目已经很大了。
人们不build议使用数组作为CoreData实体的属性的原因是:数组必须转换为原始数据才能将其存储到persistentStore中,然后在从存储中读取对象时必须将其转换回来。 这有可能会变得缓慢,原始数据可能变得“大”。 重要的是,因为属性是以原始数据存储的,所以不能使用依赖于数组属性内容的谓词来获取存储对象的一个子集。 所以举个例子,你不能(容易地)获取“只有数组只有一个成员的对象”。
所以,人们推荐使用一种关系。 我强烈build议你创build子类; 如果你这样做会让你的生活变得如此轻松。 但是可以不使用子类来使用关系。 假设你有一个Person
实体(带有name
和dateOfBirth
属性)和一个Course
实体(只带有一个name
属性)。
假设每个Person
只能参加一个Course
,但每个Course
都可以有几个人参加。 您可以创build一对一的关系,并将其命名为attendees
。 相反的关系将是to-one
名为类似的事情。 模型将如下所示:
您熟悉使用valueForKey
和setValue: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
,并且你使用可变集合方法被卡住了。
- 为什么我所有的NSManagedObjects都立即出错?
- 在Swift中保存CoreData对多关系
- 核心数据迁移:无法将types“NSManagedObject_MyType”的值转换为“MyModule.MyType”
- 如何获得核心数据模型打印时适合1页的图片?
- RestKit比较本地对象和远程对象之前映射或实际插入到CoreData DB
- iOS CoreData NSPredicate一次查询多个属性
- UITableView删除/添加行导致CoreData:严重的应用程序错误,如果在SplitViewController的MasterView中select了另一个对象
- CoreData:警告:无法为实体“Readings”加载名为“WEEReadings”的类。 找不到类,使用默认的NSManagedObject来代替
- 核心数据崩溃::对象不能为零