生活随笔
收集整理的這篇文章主要介紹了
iOS持久化存储-CoreData简介
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文目錄 - 一、簡介
- 二、模型文件
- 三、了解NSManagedObject對象
- 四、CoreData中的核心對象
- 五、代碼實現
- 六、打開CoreData的SQL語句輸出開關
- 七、創建NSManagedObject的子類
回到頂部
一、簡介
? Core Data是iOS5之后才出現的一個框架,它提供了對象-關系映射(ORM)的功能,即能夠將OC對象轉化成數據,保存在SQLite數據庫文件中,也能夠將保存在數據庫中的數據還原成OC對象。在此數據操作期間,我們不需要編寫任何SQL語句,這個有點類似于著名的Hibernate持久化框架,不過功能肯定是沒有Hibernate強大的。簡單地用下圖描述下它的作用:
左邊是關系模型,即數據庫,數據庫里面有張person表,person表里面有id、name、age三個字段,而且有2條記錄;
右邊是對象模型,可以看到,有2個OC對象;
利用Core Data框架,我們就可以輕松地將數據庫里面的2條記錄轉換成2個OC對象,也可以輕松地將2個OC對象保存到數據庫中,變成2條表記錄,而且不用寫一條SQL語句。
?
回到頂部
二、模型文件
? 在Core Data,需要進行映射的對象稱為實體(entity),而且需要使用Core Data的模型文件來描述app中的所有實體和實體屬性。這里以Person(人)和Card(身份證)2個實體為例子,先看看實體屬性和實體之間的關聯關系:
Person實體中有:name(姓名)、age(年齡)、card(身份證)三個屬性
Card實體中有:no(號碼)、person(人)兩個屬性
接下來看看創建模型文件的過程:
1.選擇模板
??
2.添加實體
3.添加Person的2個基本屬性
4.添加Card的1個基本屬性
5.建立Card和Person的關聯關系
????????
右圖中的表示Card中有個Person類型的person屬性,目的就是建立Card跟Person之間的一對一關聯關系(建議補上這一項),在Person中加上Inverse屬性后,你會發現Card中Inverse屬性也自動補上了
?
回到頂部
三、了解NSManagedObject對象
1.通過Core Data從數據庫取出的對象,默認情況下都是NSManagedObject對象
??
2.NSManagedObject的工作模式有點類似于NSDictionary對象,通過鍵-值對來存取所有的實體屬性
1>?setValue:forKey:存儲屬性值(屬性名為key)
2>?valueForKey:獲取屬性值(屬性名為key)
回到頂部
四、CoreData中的核心對象
注:黑色表示類名,紅色表示類里面的一個屬性
開發步驟總結:
1.初始化NSManagedObjectModel對象,加載模型文件,讀取app中的所有實體信息 2.初始化NSPersistentStoreCoordinator對象,添加持久化庫(這里采取SQLite數據庫) 3.初始化NSManagedObjectContext對象,拿到這個上下文對象操作實體,進行CRUD操作
回到頂部
五、代碼實現
先添加CoreData.framework和導入主頭文件<CoreData/CoreData.h> 1.搭建上下文環境
?? NSManagedObjectModel?*model?=?[NSManagedObjectModel?mergedModelFromBundles:nil];?? ?? NSPersistentStoreCoordinator?*psc?=?[[[NSPersistentStoreCoordinator?alloc]?initWithManagedObjectModel:model]?autorelease];?? ?? NSString?*docs?=?[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,?YES)?lastObject];?? NSURL?*url?=?[NSURL?fileURLWithPath:[docs?stringByAppendingPathComponent:@"person.data"]];?? ?? NSError?*error?=?nil;?? NSPersistentStore?*store?=?[psc?addPersistentStoreWithType:NSSQLiteStoreType?configuration:nil?URL:url?options:nil?error:&error];?? if?(store?==?nil)?{??? ????[NSException?raise:@"添加數據庫錯誤"?format:@"%@",?[error?localizedDescription]];?? }?? ?? NSManagedObjectContext?*context?=?[[NSManagedObjectContext?alloc]?init];?? context.persistentStoreCoordinator?=?psc;?? ?? 2.添加數據到數據庫 ?? NSManagedObject?*person?=?[NSEntityDescription?insertNewObjectForEntityForName:@"Person"?inManagedObjectContext:context];?? ?? [person?setValue:@"MJ"?forKey:@"name"];?? [person?setValue:[NSNumber?numberWithInt:27]?forKey:@"age"];?? ?? NSManagedObject?*card?=?[NSEntityDescription?insertNewObjectForEntityForName:@"Card"?inManagedObjectContext:context];?? [card?setValue:@"4414241933432"?forKey:@"no"];?? ?? [person?setValue:card?forKey:@"card"];?? ?? NSError?*error?=?nil;?? BOOL?success?=?[context?save:&error];?? if?(!success)?{?? ????[NSException?raise:@"訪問數據庫錯誤"?format:@"%@",?[error?localizedDescription]];?? }?? ?? 3.從數據庫中查詢數據 ?? NSFetchRequest?*request?=?[[[NSFetchRequest?alloc]?init]?autorelease];?? ?? request.entity?=?[NSEntityDescription?entityForName:@"Person"?inManagedObjectContext:context];?? ?? NSSortDescriptor?*sort?=?[NSSortDescriptor?sortDescriptorWithKey:@"age"?ascending:NO];?? request.sortDescriptors?=?[NSArray?arrayWithObject:sort];?? ?? NSPredicate?*predicate?=?[NSPredicate?predicateWithFormat:@"name?like?%@",?@"*Itcast-1*"];?? request.predicate?=?predicate;?? ?? NSError?*error?=?nil;?? NSArray?*objs?=?[context?executeFetchRequest:request?error:&error];?? if?(error)?{?? ????[NSException?raise:@"查詢錯誤"?format:@"%@",?[error?localizedDescription]];?? }?? ?? for?(NSManagedObject?*obj?in?objs)?{?? ????NSLog(@"name=%@",?[obj?valueForKey:@"name"]?? }?? 注:Core Data不會根據實體中的關聯關系立即獲取相應的關聯對象,比如通過Core Data取出Person實體時,并不會立即查詢相關聯的Card實體;當應用真的需要使用Card時,才會再次查詢數據庫,加載Card實體的信息。這 個就是Core Data的延遲加載機制
4.刪除數據庫中的數據 ?? [context?deleteObject:managedObject];?? ?? NSError?*error?=?nil;?? [context?save:&error];?? if?(error)?{?? ????[NSException?raise:@"刪除錯誤"?format:@"%@",?[error?localizedDescription]];?? }?? ?
回到頂部
六、打開CoreData的SQL語句輸出開關
1.打開Product,點擊EditScheme... 2.點擊Arguments,在ArgumentsPassed On Launch中添加2項 1> -com.apple.CoreData.SQLDebug 2> 1 ??
回到頂部
七、創建NSManagedObject的子類
默認情況下,利用Core Data取出的實體都是NSManagedObject類型的,能夠利用鍵-值對來存取數據。但是一般情況下,實體在存取數據的基礎上,有時還需要添加一些業務方法來完成一些其他任務,那么就必須創建NSManagedObject的子類
選擇模型文件?
選擇需要創建子類的實體?
創建完畢后,多
了2個子類?
文件內容展示:
Person.h #import?<Foundation/Foundation.h>?? #import?<CoreData/CoreData.h>?? ?? @class?Card;?? ?? @interface?Person?:?NSManagedObject?? ?? @property?(nonatomic,?retain)?NSString?*?name;?? @property?(nonatomic,?retain)?NSNumber?*?age;?? @property?(nonatomic,?retain)?Card?*card;?? ?? @end?? Person.m #import?"Person.h"?? ?? @implementation?Person?? ?? @dynamic?name;?? @dynamic?age;?? @dynamic?card;?? ?? @end??
Card.h
#import?<Foundation/Foundation.h>?? #import?<CoreData/CoreData.h>?? ?? @class?Person;?? ?? @interface?Card?:?NSManagedObject?? ?? @property?(nonatomic,?retain)?NSString?*?no;?? @property?(nonatomic,?retain)?Person?*person;?? ?? @end??
Card.m
#import?"Card.h"?? #import?"Person.h"?? ?? @implementation?Card?? ?? @dynamic?no;?? @dynamic?person;?? ?? @end??
那么往數據庫中添加數據的時候就應該寫了:
Person?*person?=?[NSEntityDescription?insertNewObjectForEntityForName:@"Person"?inManagedObjectContext:context];?? person.name?=?@"MJ";?? person.age?=?[NSNumber?numberWithInt:27];?? ?? Card?*card?=?[NSEntityDescription?insertNewObjectForEntityForName:@”Card"?inManagedObjectContext:context];?? card.no?=?@”4414245465656";?? person.card?=?card;?? ??
說到這里,整個Core Data框架的入門就結束了,其實Core Data還遠不止這些功能,它還支持自動撤銷機制,一對多關聯等,這里就不一一介紹了
總結
以上是生活随笔為你收集整理的iOS持久化存储-CoreData简介的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。