Core Data浅谈系列之三 : 了解NSManagedObject和NSPredicate

网友投稿 266 2022-08-24

Core Data浅谈系列之三 : 了解NSManagedObject和NSPredicate

​​上一篇文章​​​用实际代码演示了Core Data应用中基本的增删改查操作,使用的是NSManagedObject对象,利用 ​​​KVC​​来修改、获取对象的属性值。

除此之外,我们还可以创建与Player、Team相对应的具体的NSManagedObject子类,如下图:

1. @interface Player : NSManagedObject2. 3. @property (nonatomic, retain) NSNumber * age;4. @property (nonatomic, retain) NSString * name;5. 6. @end7. 8. 9. @implementation Player10. 11. @dynamic age;12. @dynamic name;13. 14. @end

这里的属性age和name并没有使用@synthesize进行合成,而是使用 ​​@dynamic​​​,表明该属性的 ​​访问函数​​并非由该类来提供。

有了自定义子类后,我们就可以更简洁地操作对象,比如对Team的读写可以改成:

[cpp]  ​​view plain​​​ ​​copy​​

NSArray *teamArray = [self fetchTeamList];if (teamArray) {for (Team *teamObject in teamArray) {"Team info : %@, %@\n", teamObject.name, teamObject.city);}}

以及 :

1. Team *teamObject = [NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:self.managedObjectContext];2. teamObject.name = teamName;3. teamObject.city = teamCity;

然后再执行一遍程序。这时候,发现程序输出重复的球队信息,因为我们创建了两次同样的数据。但实际上一个联盟不应该存在相同名称的两支球队,所以我们应该在插入数据的时候进行验证(这种情况下,创建Team的函数也根据含义而改名):

1. - (BOOL)insertTeamWithName:(NSString *)teamName city:(NSString *)teamCity2. {3. if (!teamName || !teamCity) {4. return NO;5. }6. 7. Team *teamObject = [self getTeamInfoByName:teamName];8. if (nil == teamObject) {9. "Team" inManagedObjectContext:self.managedObjectContext];10. }11. 12. teamObject.name = teamName;13. teamObject.city = teamCity;14. 15. return YES;16. }17. 18. - (Team *)getTeamInfoByName:(NSString *)teamName19. {20. Team *teamObject = nil;21. 22. NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];23. 24. "Team" inManagedObjectContext:self.managedObjectContext];25. [fetchRequest setEntity:teamEntity];26. 27. "name == %@", teamName];28. [fetchRequest setPredicate:predicate];29. [fetchRequest setFetchLimit:1];30. 31. NSError *error = NULL;32. NSArray *array = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];33. if (error) {34. "Error : %@\n", [error localizedDescription]);35. }36. 37. if (array && [array count] > 0) {38. teamObject = [array objectAtIndex:0];39. }40. 41. [fetchRequest release], fetchRequest = nil;42. 43. return teamObject;44. }

把已经安装的App删除,然后重新运行下程序,可以看到不管运行多少次,都只会有Heat和Lakers两支球队的信息输出。

这是我们显式创建新的NSManagedObject实例时所采取的去重方案,使用 ​​NSPredicate​​进行条件查询,如果已经存在指定名称的球队就不再重复创建。

如果是在关联属性时这么写代码,比如为一支球队添加多名球员,会显得有点冗余。对于这种情况,可以进行 ​​属性验证​​​,这会和 ​​NSPredicate的使用​​放在后面进一步讨论。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:图文解释及文字版XCode常用快捷键的使用
下一篇:苹果营销课:如何把偷工减料说得清新脱俗!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~