天天看點

IOS-Coredata 核心資料庫的基礎使用

demo資源連結

功能介紹

CoreData核心資料庫,是cocoa架構中得一個用于管理資料庫和對象之間映射關系的一套支援庫,它主要提供ORM(對象關系映射)功能,可以将OC對象轉化為資料,儲存在本地資料庫也可以将資料庫中的資料還原成OC對象,極大的簡化了操作.CoreData不僅支援SQLite資料庫還支援XML,記憶體和二進制檔案的儲存

庫檔案

CoreData.framework

涉及類

類名 所屬庫 功能
NSManaged Object Model CoreData 描述應用程式的資料模型,這個模型包含實體(Entity),特性(Property),讀取請求
NSManaged Object Context CoreData 參與對資料對象進行操作的全過程,并檢測資料對象的變化,以提供對undo/redo的支援及更新綁 定到資料的UI.
NSManaged Object CoreData 資料對象,用于儲存從資料庫獲得的資料,與ManagedObjectContext關聯.
NSPersisterStore Coordinator CoreDara 資料檔案管理器,用于處理對資料庫的增删改查操作.一般不需要對這個類進行操作.
NSEntityDescription CoreData 表實體結構,管理表的結構,從表結構中建立實體類
NSSortDescriptor Foundation 負責管理查詢資料時,資料的排列方式
NSFetchRequest CoreData 查詢結果集,主要用于查詢資料,并傳回結果,可以設定查詢條件和查詢順序
NSPredicate Foundation 謂詞條件,使用謂詞來為FetchRuquest設定查詢條件

建立資料庫模型檔案

1.選擇模闆
IOS-Coredata 核心資料庫的基礎使用

Command + N打開建立檔案視窗,選擇Core Data目錄中的Data Model然後Next

2.建立模型實體
IOS-Coredata 核心資料庫的基礎使用

這裡建立了一個名叫People的執行個體資料庫,裡面有兩個字段age和name分别是整型和字元串類型的

使用代碼對資料庫進行操作

1.編寫代碼建立上下文
建立一個繼承與NSObjcet的類,建立一個NSManagedObjectContext屬性,命名為ManagedObjectContext
- (instancetype)init{
    self = [super init];
    if (self) {
        //擷取資料庫模型的本地url Model.xcdatamodeld編譯後的字尾為momd;
        NSURL * modelUrl = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
        //建立模型對象,從資料庫模型中建立對象
        NSManagedObjectModel * model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];
        //建立檔案管理器管理模型對象.
        NSPersistentStoreCoordinator * store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
        //設定資料庫檔案儲存的路徑,字尾為sqlite
        NSURL * dataURL = [[[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]URLByAppendingPathComponent:@"mySQL.sqlite"];
        NSError * error = nil;
        //生成本地資料庫檔案,并設定生成檔案的類型為SQLite
        [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:dataURL options:nil error:&error];
        if (error) {
            NSLog(@"建立資料庫失敗!");
            abort();
        }else{
            //生成檔案成功,建立用于操作資料庫的上下文
            _managerObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
            //設定上下文操作的資料庫管理器,不需要直接操作PersistentStoreCoordinator,我們隻要操作上下文就可以對資料庫進行增删改查.
            [_managerObjectContext setPersistentStoreCoordinator:store];
        }

    }
    return self;
}
           
2.為資料庫添加一條資料
//增
- (void)addPeopleObjectWithPeopleName:(NSString *)name peopleAge:(NSNumber *)age{
    //根據People實體模型建立一個新的People對象,并加入上下文管理
    NSManagedObject * people = [NSEntityDescription insertNewObjectForEntityForName:@"People" inManagedObjectContext:_managerObjectContext];
    //設定people的屬性
    [people setValue:name forKey:@"name"];
    [people setValue:age forKey:@"age"];
    //同步資料到本地資料庫.這裡要注意下,即使沒有儲存到本地,依然能查找到這個條目,隻不過APP下次運作就沒有了.
    if([_managerObjectContext save:nil]){
        NSLog(@"儲存資料成功!");
    }
}
           
3.查詢資料,資料排序
//按照年齡排序并查找年齡小于1的條目
- (NSArray *)sortPeopleWithAge{
    //建立一個結果集
    NSFetchRequest * request = [[NSFetchRequest alloc] init];
    //設定結果集所對應的實體和上下文,這裡表示查詢People實體内的資料, 這裡的People要和模型檔案中得實體名稱相同
    request.entity = [NSEntityDescription entityForName:@"People" inManagedObjectContext:_managerObjectContext];
    //建立一個排序規則,按照age進行升序排列
    NSSortDescriptor * sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
    //可以添加多個排序規則
    request.sortDescriptors = @[sort];
    //添加謂詞,為查找指定條件為 age屬性大于1的條目
    NSPredicate * predicate = [NSPredicate predicateWithFormat:@"age > 1"];
    request.predicate = predicate;
    //擷取查找結果
    NSArray * array = [_managerObjectContext executeFetchRequest:request error:nil];
    return array;
}
           
4.修改資料
//改
- (NSManagedObject *)updatePeopleName:(NSString *)name toNewName:(NSString *)newName{
    //查找要修改的資料條目
    NSManagedObject * people = [self peopleObjectWithName:name];
    //修改屬性
    [people setValue:newName forKey:@"name"];
    //同步儲存到本地資料庫
    [_managerObjectContext save:nil];
    return people;
}
           
5.删除一條資料
//删
- (void)deletePeopleObjectWithName:(NSString *)name{
    //查找要删除的資料條目
    NSManagedObject * people = [self peopleObjectWithName:name];
    //删除條目
    [_managerObjectContext deleteObject:people];
    //同步儲存到本地資料庫
    if([_managerObjectContext save:nil]){
        NSLog(@"删除成功!");
    }
}
           
注:在使用context儲存之前所做的更改如:建立新的對象,删除對象,修改對象屬性,一樣會影響FetchRequest查找到的資料,但是不會影響本地儲存的資料,[context save]方法的作用是将程式記憶體中所有的資料庫資料同步儲存到本地.可以使用[context hasChange]方法來判斷本地資料和記憶體中的資料是否一緻.