除此之外,我们还可以创建与Player、Team相对应的具体的NSManagedObject子类,如下图:
Xcode会为我们生成子类的代码,如Player的接口声明和实现(汗,从Xcode复制代码到Evernote,有些空格会被省略):
- @interface Player : NSManagedObject
- @property (nonatomic, retain) NSNumber * age;
- @property (nonatomic, retain) NSString * name;
- @end
- @implementation Player
- @dynamic age;
- @dynamic name;
- @end
有了自定义子类后,我们就可以更简洁地操作对象,比如对Team的读写可以改成:
- NSArray *teamArray = [self fetchTeamList];
- if (teamArray) {
- for (Team *teamObject in teamArray) {
- NSLog(@"Team info : %@, %@\n", teamObject.name, teamObject.city);
- }
- }
以及 :
- Team *teamObject = [NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:self.managedObjectContext];
- teamObject.name = teamName;
- teamObject.city = teamCity;
然后再执行一遍程序。这时候,发现程序输出重复的球队信息,因为我们创建了两次同样的数据。但实际上一个联盟不应该存在相同名称的两支球队,所以我们应该在插入数据的时候进行验证(这种情况下,创建Team的函数也根据含义而改名):
- - (BOOL)insertTeamWithName:(NSString *)teamName city:(NSString *)teamCity
- {
- if (!teamName || !teamCity) {
- return NO;
- }
- Team *teamObject = [self getTeamInfoByName:teamName];
- if (nil == teamObject) {
- teamObject = [NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:self.managedObjectContext];
- }
- teamObject.name = teamName;
- teamObject.city = teamCity;
- return YES;
- }
- - (Team *)getTeamInfoByName:(NSString *)teamName
- {
- Team *teamObject = nil;
- NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
- NSEntityDescription *teamEntity = [NSEntityDescription entityForName:@"Team" inManagedObjectContext:self.managedObjectContext];
- [fetchRequest setEntity:teamEntity];
- NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", teamName];
- [fetchRequest setPredicate:predicate];
- [fetchRequest setFetchLimit:1];
- NSError *error = NULL;
- NSArray *array = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
- if (error) {
- NSLog(@"Error : %@\n", [error localizedDescription]);
- }
- if (array && [array count] > 0) {
- teamObject = [array objectAtIndex:0];
- }
- [fetchRequest release], fetchRequest = nil;
- return teamObject;
- }
把已经安装的App删除,然后重新运行下程序,可以看到不管运行多少次,都只会有Heat和Lakers两支球队的信息输出。
这是我们显式创建新的NSManagedObject实例时所采取的去重方案,使用NSPredicate进行条件查询,如果已经存在指定名称的球队就不再重复创建。
如果是在关联属性时这么写代码,比如为一支球队添加多名球员,会显得有点冗余。对于这种情况,可以进行属性验证,这会和NSPredicate的使用放在后面进一步讨论。
相关推荐
ManagedMappingObject NSManagedObject <-> NSDictionary (例如JSON Model类) 将NSManagedObject转换为NSDictionary(然后再次转换)。安装 pod 'ManagedMappingObject'用法1设置NSManagedObject类。 您可以...
MagicalMapper 是一个映射库,它采用键/值字典并将它们映射到 Core Data 托管对象。 让我们看一个例子。 下面是我们的核心数据模型是如何定义的 class User : NSManagedObject { @NSManaged var id: NSNumbe @...
Tuts +教程:核心数据和Swift:关系和更多获取授课教师:Bart Jacobs 在上一篇文章中,我们了解了NSManagedObject以及使用Core Data创建,读取,更新和删除记录的难易程度。 但是,在该讨论中我没有提及关系。 除了...
15 Adding the Core Data Framework...............................................................................................15 Creating the Data Model ...............................................
机房CRLoom是用于帮助导入,更新和查询NSManagedObject的框架。概述NSManagedObjectImportOperation 这是通过创建的NSOperation子类+ (instanceType)operationWithData:( id )data managedObjectClass:( Class )...
DataManager是轻量级的Core Data实用程序。 它不是核心数据的替代/包装。 这儿是一些精彩片段: 封装与设置核心数据堆栈相关的样板。 将具有私有NSPrivateQueueConcurrencyType上下文的堆栈设置为具有公共...
创建控制器比方说,你想显示每节Day它可以包含一些数量的Event中: @interface Day : NSManagedObject@property id sortKey;@property NSOrderedSet *events;@end@interface Event : NSManagedObject@property Day *...
CWCoreData ===========包含对CoreData中的类的便利添加,以便在需要时懒惰地创建托管对象模型,持久存储关联器和线程本地托管对象上下文。 NSI还具有附加功能CWCoreData ==========包含对CoreData中的类的方便附加...
这些类都是一些抽象的结构类,并不存储实际每条数据的信息,具体的数据由NSManagedObject类来描述,我们一般会将实体类化继承于NSManagedObject。 Xocde工具提供了快捷的实体类化功能,还拿我们一开始创建的班级与...
提供使用NSManagedObject和NSManagedObjectContext在多线程环境中工作的便捷方法和类。 编纂了一些有效导入大型数据集的良好做法。 安装 使用 ,将pod 'SQKDataKit'添加到您的Podfile中。 根据需要#import ...
SSMagicManagedObject : NSManagedObject的核心子类,具有多个辅助对象,可与一起使用。 SPLCore SPLCore.h :基本头文件。 SPLDebug.h :宏和调试帮助器。 SPLFloat.h :在arm64 / armv7上进行浮点和双打的助手...
上下文观察者这是一个小型库,用于管理CoreData通知,以便在插入,删除或更新NSManagedObject时更新用户界面。 ContextObserver的工作方式类似于NSFetchedResultsController,即观察被管理对象上下文的...
@interface _Organisation : NSManagedObject // / Returns an attribute for the name property. + (QKAttribute *) name ; // / Returns an attribute for the relationship members. + (PersonAttribute *) ...
EVReflection一般信息目前,master分支已通过Swift 4.2和5.0 beta测试。如果您想继续使用旧版本的EVReflection,请使用相应的分支。 运行单元测试以查看EVReflection的作用。 请立即更新到cocoapods 1.7.0,您可以...
轻量级、多线程的 Core Data 堆栈。 设计目标是易用性、编译时检查和一些常见用例的包装器。 这个库旨在涵盖大多数用例,支持约定而不是配置,并且只是让您的生活更轻松。 如果您有一些特殊要求,例如具有多个托管...
介绍 该项目旨在使您轻松查看用于描述核心数据托管对象模型的.xcdatamodel文件的不同版本(例如git diff )之间的git diff 。...@@ -3,7 +3,7 @@ Entity: Image (NSManagedObject) Rel: recipe Recipe image
所有配置文件均由具有@dynamic属性的类表示,这些属性类似于Core Data的NSManagedObject。 安装 GSConfiguration可通过。 要安装它,只需将以下行添加到您的Podfile中: pod "GSConfiguration" 基本用法 使用...
使核心数据可用准备 AppDelegate、xcdatamodeld 和 NSManagedObject 的子类 2. 将本项目中包含的摩根石类放在那里除了 Morganite.swift 就跟垃圾一样,暂时来说 ViewController 不值得作为一个使用的例子... 3.带...
支持创建多个PKRecord去连接多个DataModel.对NSManagedObject的Category扩展能方便的进行FURC(Fetch,Update,Read,Create)操作。 示例Demo需要安装mogenerator(https://github.com/rentzsch/mogenerator)才可...
1、创建DataModel(用默认名称Model就好,如果需要用特殊的名称,需要调用KICoreDataManager里面的setupWithModelName:dbSavePath方法进行配置),并添加Entity(比如 User)2、根据Entity创建NSManagedObject ...