在前兩篇博客中,分別介紹了iOS中CoreData框架建立數據模型和CoreData框架中的三個核心類。博客地址以下:sql
iOS中CoreData框架簡介:http://my.oschina.net/u/2340880/blog/610488。數據庫
CoreData框架中三個核心的類:http://my.oschina.net/u/2340880/blog/610948。框架
本篇博客將綜合使用三個核心的類,進行數據建立和查詢的操做介紹。工具
前面博客介紹的NSManagedObjectModel是數據管理模型,能夠將其類好比數據庫,NSManagedObjectModel中存放着數據庫的結構信息。NSEntityDescription是實體描述對象,它能夠類好比數據庫中的表,NSEntityDescription存放的是表的結構信息。這些類都是一些抽象的結構類,並不存儲實際每條數據的信息,具體的數據由NSManagedObject類來描述,咱們通常會將實體類化繼承於NSManagedObject。fetch
Xocde工具提供了快捷的實體類化功能,還拿咱們一開始建立的班級與學生實體來演示,點擊.xcdatamodeld文件,點擊Xcode工具上方導航欄的Editor標籤,選擇Creat NSManagedObject Subclass選項,在彈出的窗口中勾選要類化的實體,以下圖:atom
這時,Xcode會自動爲咱們建立一個文件,這些文件中有各個類中屬性的聲明。spa
使用以下代碼進行數據的建立:.net
//讀取數據模型文件 NSURL *modelUrl = [[NSBundle mainBundle]URLForResource:@"Model" withExtension:@"momd"]; //建立數據模型 NSManagedObjectModel * mom = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelUrl]; //建立持久化存儲協調者 NSPersistentStoreCoordinator * psc = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:mom]; //數據庫保存路徑 NSURL * path =[NSURL fileURLWithPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"CoreDataExample.sqlite"]]; //爲持久化協調者添加一個數據接收棧 /* 能夠支持的類型以下: NSString * const NSSQLiteStoreType;//sqlite NSString * const NSXMLStoreType;//XML NSString * const NSBinaryStoreType;//二進制 NSString * const NSInMemoryStoreType;//內存 */ [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:path options:nil error:nil]; //建立數據管理上下文 NSManagedObjectContext * moc = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType]; //關聯持久化協調者 [moc setPersistentStoreCoordinator:psc]; //建立數據對象 /* 數據對象的建立是經過實體名獲取到的 */ SchoolClass * modelS = [NSEntityDescription insertNewObjectForEntityForName:@"SchoolClass" inManagedObjectContext:moc]; //對數據進行設置 modelS.name = @"第一班"; modelS.stuNum = @60; //進行存儲 if ([moc save:nil]) { NSLog(@"新增成功"); } NSLog(@"%@",[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"CoreDataExample.sqlite"]);
找到在打印出的路徑,會發現裏面多了一個sqlite文件,其中有一張表中添加進了一條數據。code
CoreData中經過查詢請求來對數據進行查詢操做,查詢請求由NSFetchRequest來進行管理和維護。orm
NSFetchRequest主要提供兩個方面的查詢服務:
1.提供範圍查詢的相關功能
2.提供查詢結果返回類型與排序的相關功能
NSFetchRequest中經常使用方法以下:
//建立一個實體的查詢請求 能夠理解爲在某個表中進行查詢 + (instancetype)fetchRequestWithEntityName:(NSString*)entityName; //查詢條件 @property (nullable, nonatomic, strong) NSPredicate *predicate; //數據排序 @property (nullable, nonatomic, strong) NSArray<NSSortDescriptor *> *sortDescriptors; //每次查詢返回的數據條數 @property (nonatomic) NSUInteger fetchLimit; //設置查詢到數據的返回類型 /* typedef NS_OPTIONS(NSUInteger, NSFetchRequestResultType) { NSManagedObjectResultType = 0x00, NSManagedObjectIDResultType = 0x01, NSDictionaryResultType NS_ENUM_AVAILABLE(10_6,3_0) = 0x02, NSCountResultType NS_ENUM_AVAILABLE(10_6,3_0) = 0x04 }; */ @property (nonatomic) NSFetchRequestResultType resultType; //設置查詢結果是否包含子實體 @property (nonatomic) BOOL includesSubentities; //設置要查詢的屬性值 @property (nullable, nonatomic, copy) NSArray *propertiesToFetch;
在SchoolClass實體中查詢數據,使用以下的代碼:
//建立一條查詢請求 NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"SchoolClass"]; //設置條件爲 stuNum=60的數據 [request setPredicate:[NSPredicate predicateWithFormat:@"stuNum == 60"]]; //進行查詢操做 NSArray * res = [moc executeFetchRequest:request error:nil]; NSLog(@"%@",[res.firstObject stuNum]);
專一技術,熱愛生活,交流技術,也作朋友。
——琿少 QQ羣:203317592