數據庫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 }

 

效果圖

 

文章爲做者原著,轉載請標明出處。歡迎讀者找錯。

相關文章
相關標籤/搜索