iOS中CoreData數據管理系列三——添加與查詢數據

iOS中CoreData數據管理系列三——添加與查詢數據

1、引言

    在前兩篇博客中,分別介紹了iOS中CoreData框架建立數據模型和CoreData框架中的三個核心類。博客地址以下:sql

iOS中CoreData框架簡介:http://my.oschina.net/u/2340880/blog/610488數據庫

CoreData框架中三個核心的類:http://my.oschina.net/u/2340880/blog/610948框架

本篇博客將綜合使用三個核心的類,進行數據建立和查詢的操做介紹。工具

2、創建數據對象類

    前面博客介紹的NSManagedObjectModel是數據管理模型,能夠將其類好比數據庫,NSManagedObjectModel中存放着數據庫的結構信息。NSEntityDescription是實體描述對象,它能夠類好比數據庫中的表,NSEntityDescription存放的是表的結構信息。這些類都是一些抽象的結構類,並不存儲實際每條數據的信息,具體的數據由NSManagedObject類來描述,咱們通常會將實體類化繼承於NSManagedObject。fetch

    Xocde工具提供了快捷的實體類化功能,還拿咱們一開始建立的班級與學生實體來演示,點擊.xcdatamodeld文件,點擊Xcode工具上方導航欄的Editor標籤,選擇Creat NSManagedObject Subclass選項,在彈出的窗口中勾選要類化的實體,以下圖:atom

這時,Xcode會自動爲咱們建立一個文件,這些文件中有各個類中屬性的聲明。spa

3、建立一條數據

    使用以下代碼進行數據的建立:.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

4、查詢數據

    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

相關文章
相關標籤/搜索