Core Data

1、Core Data基本概念

1.1 概述

  • Core Data不是數據庫,而是使⽤數據庫、XML、⼆進制⽂件等方式來存儲數據的⼀個框架。
    • Core Data是iOS3以後纔出現的一個框架,容許咱們以⾯向對象的⽅式儲存和管理數據。使⽤用Core Data框架,咱們能夠很輕鬆有效地經過面向對象的接口管理數據。
  • Core Data框架提供了對象-關係映射(ORM)的功能,即可以將OC對象轉化成數據,保存在SQLite3數據庫⽂件中,也可以將保存在數據庫中的數據還原成OC對象。
  •  在數據操做過程當中,⽆需編寫任何SQL語句。

1.2 CoreData核心對象

  •  NSManagedObject:模型對象,或者叫實體(entity),可理解爲OC裏的對象。sql

  • NSManagedObjectModel:模型文件(.xcdatamodeld),記錄全部的模型對象及對象的屬性數據庫

  • NSPersistentStoreCoordinator:持久化存儲協調者,是數據庫和程序之間的橋樑, ⽤用來設置數據存儲的名字,位置,存儲方式,和存儲時機。⽤用來執行具體的CRUD操做。
  • NSManagedObjectContext:對象管理上下文,用戶全部的持久化操做都是經過此對象。再由此對象去調用NSPersistentStoreCoordinator對象執行具體的操做。

1.3 模塊詳細講解

一、應用程序先建立或讀取模型文件(後綴爲xcdatamodeld)生成 NSManagedObjectModel 對象。 Document應⽤程序是通常是經過 NSDocument 或其子類 NSPersistentDocument)從模型文件(後綴爲 xcdatamodeld)讀取。
二、而後⽣成 NSManagedObjectContext 和 NSPersistentStoreCoordinator 對象,前者對用戶透明地調用後 者對數據文件進行讀寫。app

三、NSPersistentStoreCoordinator 負責從數據文件(xml, sqlite,⼆進制⽂件等)中讀取數據⽣成 Managed Object,或保存 Managed Object 寫入數據⽂文件。
四、NSManagedObjectContext 參與對數據進行各類操做的整個過程,它持有 Managed Object。咱們經過它 來監測 Managed Object。監測數據對象有兩個做⽤:支持 undo/redo 以及數據綁定。這個類是最常被⽤用到 的。框架

五、Array Controller, Object Controller, Tree Controller 這些控制器⼀般與 NSManagedObjectContext 關聯, 所以咱們能夠經過它們在 nib 中可視化地操做數據對象。fetch


2、Core Data的使用spa

2.1 保存數據的方式 

  • 偏好設置(NSUserDefault)
  • 歸檔
  • sqlite
  • CoreData (基於sqlite的封裝, 數據保存到一個數據庫文件)

2.2 建立模型

1. 建立模型文件 (至關於數據庫)

按如下步驟:代理

  1. command + N (或右鍵 New File...)
  2. Core Data
  3. Data Model
  4. 建立文件 (文件擴展名爲 .xcdatamodeld), 而後命名文件名

2. 添加實體 (至關於表)

按如下步驟:code

  1. 點擊 Add Entity (添加實體)
  2. 修改實體名 Entity 

3. 右端添加表的字段 (例如name, age, height)

2.3 搭建上下文環境

  •  生成上下文, 關聯模型文件生成數據庫orm

  • 導入頭文件 #import <CoreData/CoreData.h> sqlite

1.初始化NSManagedObjectModel對象, 加載模型文件, 讀取app中的全部實體信息;

2.初始化NSPersistentStoreCoordinator對象, 添加持久化庫(這裏採起SQLite數據庫);

3.初始化NSManagedObjectContext對象, 拿到這個上下文對象操做實體, 進行CRUD操做.

3、 實現增刪改查

3.1 添加數據(增)

得到AppDelegate的代理對象

AppDelegate *delegate = [UIApplication sharedApplication].delegate;

添加實體對象

// 建立實體對象
    // NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:delegate.managedObjectContext];

    //添加一個實體對象到 managedObjectContext 中
    User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:delegate.managedObjectContext];
    user.userID = @10002;
    user.userName = @"懷化";
    user.userAge = @30;
    user.userSex = @"男";
    user.userDate = [NSDate date];

保存上下文:

[delegate saveContext];

3.2 查詢數據(查)

建立一個取值請求:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];

使用謂詞設置查詢條件:

request.predicate = [NSPredicate predicateWithFormat:@"userAge < 35"];
request.predicate = [NSPredicate predicateWithFormat:@"userName LIKE '*楊*'"];

設置查詢的條數:

request.fetchLimit = 2;

指定從某個位置開始查詢(分頁效果)

request.fetchOffset = 2;

按某個字段升序、降序排列(YES爲升序,NO爲降序)

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"userAge" ascending:YES];
    request.sortDescriptors = @[sort];

在上下文中執行取值請求:

NSArray *objects = [delegate.managedObjectContext executeFetchRequest:request error:&error];

    [objects enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

        User *user = (User *)obj;

        NSLog(@"%@ %@ %@ %@ %@",user.userID, user.userName, user.userAge, user.userSex, user.userDate);
    }];

以下NSFetchRequest 經常使用方法:

-setEntity: 設置你要查詢的數據對象的類型(Entity)
-setPredicate: 設置查詢條件
-setFetchLimit: 設置最大查詢對象數目
-setSortDescriptors: 設置查詢結果的排序方法
-setAffectedStores: 設置能夠在哪些數據存儲中查詢

3.3 修改數據數據(改)

查詢:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];
    request.predicate = [NSPredicate predicateWithFormat:@"userID == '10005'"];

    NSArray *objects = [delegate.managedObjectContext executeFetchRequest:request error:nil];

修改:

[objects enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
       User *user = (User *)obj;
   user.userDate = [NSDate date];
    //保存
       [delegate saveContext];
}

3.4 刪除數據(刪)

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];
    request.predicate = [NSPredicate predicateWithFormat:@"userID == '10005'"];

    NSArray *objects = [delegate.managedObjectContext executeFetchRequest:request error:nil];

    [objects enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

        //刪除
        [delegate.managedObjectContext deleteObject:obj];

        // 保存
        [delegate saveContext];
    }];
相關文章
相關標籤/搜索