数据库CoreData (2)

 1、建立步骤

这一节主要是讲解使用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。二者不一样。读者能够本身试验。

2、代码实现

为了使用方便,将增删查的方法进行了封装。

 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 }

 

效果图

 

文章为做者原著,转载请标明出处。欢迎读者找错。

相关文章
相关标签/搜索