这一节主要是讲解使用coreData进行数据的绑定,就是两个表之间的联系。建立过程以下:数据库
(1)建立Model(上一次有提到建立过程)数组
(2)命名(能够默认)安全
(3)添加数据库。多线程
(4)建立列表(表名开头大写)并添加属性。注意属性的类型(Integer、string等)app
(5)同理设置Card。函数
(6)给两个表添加外在的联系。Relationship要选择另外一个表中的与本表相联系的属性。(Person中的cardID与Card中的number)atom
(7)同上。spa
(8)另外,还须要添加如下内容。【-com.apple.CoreData.SQLDebug】【1】线程
以上步骤结束以后,完成建立。添加模型。3d
(1)
(2)勾选建立的数据库
(3)选择建立联系的两个表。
(4)如此以后,会生成两个类
(5)在Person.h中的代码以下
1 #import <Foundation/Foundation.h> 2 #import <CoreData/CoreData.h> 3 4 @class Card; 5 6 @interface Person : NSManagedObject 7 8 @property (nonatomic, retain) NSString * name; 9 @property (nonatomic, retain) NSNumber * age; 10 @property (nonatomic, retain) NSNumber * cardID; 11 @property (nonatomic, retain) Card *number; 12 13 @end
在Person.m中的代码以下
1 #import "Person.h" 2 #import "Card.h" 3 4 @implementation Person 5 6 @dynamic name; 7 @dynamic age; 8 @dynamic cardID; 9 @dynamic number; 10 11 @end
在Card.h中的代码以下
1 #import <Foundation/Foundation.h> 2 #import <CoreData/CoreData.h> 3 4 @interface Card : NSManagedObject 5 6 @property (nonatomic, retain) NSNumber * number; 7 @property (nonatomic, retain) NSManagedObject *cardID; 8 9 @end
在Card.m中的代码以下
1 #import "Card.h" 2 3 @implementation Card 4 5 @dynamic number; 6 @dynamic cardID; 7 8 @end
能够看出,自动生成的代码已经有了各自的属性,并有了连接。须要强调的一点是,若是先给Person连接,那么在Person.h中就是 Card *number;反之,则是 在Card中 Person *cardID。二者不一样。读者能够本身试验。
为了使用方便,将增删查的方法进行了封装。
1 //单例 2 + (instancetype)shareInstancetype; 3 4 5 //读取数据文件 6 /* 7 * modelName:模型文件的名称 8 */ 9 - (void)loadDataBase:(NSString *)modelName; 10 11 //添加数据 12 /* 13 * entityName:实体名称 14 * params:@{key(试题中的属性名):value(须要存储的数据)} 15 * 16 */ 17 - (NSManagedObject *)insertEntity:(NSString *)entityName withParams:(NSDictionary *)params; 18 19 20 //查询数据 21 /* 22 * entityName:实体名称 23 * predicate:查询条件 24 * sorts:排序字符串数组 25 */ 26 - (NSArray *)queryWithEntity:(NSString *)entityName withPredicate:(NSString *)predicate withSortDescriptor:(NSArray *)sorts; 27 28 //删除数据 29 /* 30 * entityName:实体名称 31 * predicate:查询条件 32 */ 33 - (void)deleteWithEntity:(NSString *)entityName withPredicate:(NSString *)predicate;
具体实现的代码在上一篇中已经写过。只是有单例模式没有实现。
1 //单例模式 2 + (instancetype)shareInstancetype { 3 //注意野指针 4 static CoreDataManager *manager = nil; 5 static dispatch_once_t onceToken; 6 dispatch_once(&onceToken, ^{ 7 manager = [[CoreDataManager alloc] init]; 8 }); 9 return manager; 10 } 11 //重写init方法 12 - (id)init { 13 if (self = [super init]) { 14 //判断其实能够不要 15 if (!_context) { 16 //在这里写这句代码是为了与下面的context进行绑定 17 //初始化上下文本 18 _context = [[NSManagedObjectContext alloc] init]; 19 } 20 } 21 return self; 22 }
dispatch_once_t 是一种多线程,多用在类方法中用来返回一个单例,检测每次调用时,block是否执行完毕,只初始化一次
dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);
该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上做为BOOL使用)。它还接收一个但愿在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。dispatch_once不只意味着代码仅会被运行一次,并且仍是线程安全的,这就意味着你不须要使用诸如@synchronized之类的来防止使用多个线程或者队列时不一样步的问题。
看实际代码操做
1 #import "ViewController.h" 2 //导入头文件 3 #import <CoreData/CoreData.h> 4 #import "CoreDataManager.h" 5 #import "Person.h" 6 #import "Card.h"
用button操做
1 //建立数据库、表 2 - (IBAction)createTable { 3 [[CoreDataManager shareInstancetype] loadDataBase:@"Model"]; 4 } 5 //添加数据 6 - (IBAction)insert { 7 NSDictionary *dic = @{@"name":@"马二蛋",@"age":@18,@"cardID":@2305}; 8 [[CoreDataManager shareInstancetype] insertEntity:@"Person" withParams:dic]; 9 } 10 11 //查询数据 12 - (IBAction)query { 13 [[CoreDataManager shareInstancetype] queryWithEntity:@"Person" withPredicate:@" cardID = 2305 " withSortDescriptor:nil]; 14 } 15 16 //删除数据 17 - (IBAction)delet { 18 19 [[CoreDataManager shareInstancetype] deleteWithEntity:@"Person" withPredicate:@"cardID = 2305"]; 20 }
效果图
文章为做者原著,转载请标明出处。欢迎读者找错。