這一節主要是講解使用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 }
效果圖
文章爲做者原著,轉載請標明出處。歡迎讀者找錯。