1. 程式人生 > >iOS激情詳解之Core Data

iOS激情詳解之Core Data

先了解一下 Core Data 它相當於封裝了sqlite

1.Core Data 是資料持久化儲存的最佳方式,一般資料最終的儲存型別可以是:SQLite資料庫,XML,二進位制,記憶體裡,或自定義資料型別.core Data儲存的路徑格式是URL型別 ,sqlite 儲存的路徑格式是 string型別,在Mac OS X 10.5Leopard及以後的版本中,開發者也可以通過繼承NSPersistentStore類以建立自定義的儲存格式

2,Core Data的好處:能夠合理管理記憶體,避免使用sql的麻煩,高效

3.構成:

(1)NSManagedObjectContext(被管理的資料上下文, 就是臨時資料庫增刪改查就是操作的臨時DB)

操作實際內容(操作持久層)

作用:插入資料,查詢資料,刪除資料

(2)NSManagedObjectModel(被管理的資料模型, 比如Student)

資料庫所有表格或資料結構,包含各實體的定義資訊

作用:新增實體的屬性,建立屬性之間的關係

操作方法:檢視編輯器,或程式碼

(3)NSPersistentStoreCoordinator(持久化儲存助理)

相當於資料庫的聯結器

作用:設定資料儲存的名字,位置,儲存方式,和儲存時機

(4)NSManagedObject(被管理的資料記錄)

相當於資料庫中的表格記錄

(5)NSFetchRequest(獲取資料的請求)

相當於查詢語句

(6)NSEntityDescription(實體結構)

相當於表格結構

(7)字尾為.xcdatamodeld的包

裡面是.xcdatamodel檔案,用資料模型編輯器編輯

<span style="font-size:18px;">//
//  ViewController.m
//  LessonCodeData
//
//  Created by WDX on 15/10/9.
//  Copyright (c) 2015年 wangdongxu. All rights reserved.
//

#import "ViewController.h"
#import "AppDelegate.h"
#import "Student.h"

@interface ViewController ()

#pragma mark - 屬性, 被管理物件上下文(臨時資料庫)
@property (nonatomic, strong) NSManagedObjectContext *manmagerContext;




@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
}


#pragma mark - 新增
- (IBAction)addData:(id)sender {
    
    // 建立實體描述
    NSEntityDescription *studentED = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.manmagerContext];
    
    
    for (int i = 0; i < 10; i++) {
        // 根據實體描述建立實體
        Student *student = [[Student alloc] initWithEntity:studentED insertIntoManagedObjectContext:self.manmagerContext];
        
        // 給實體賦值
        student.name = [NSString stringWithFormat:@"東方紅%d號", i + 1];
        student.age = [NSNumber numberWithInt:(18 + i)];
        student.sex = [NSString stringWithFormat:@"男"];
    }
    
    
    
    NSError *error = nil;
    // 資料同步
    [self.manmagerContext save:&error];
    
    if (!error) {
        NSLog(@"儲存成功");
    }
   
}</span>
<span style="font-size:18px;">#pragma mark - 查詢
- (IBAction)findData:(id)sender {
    
    // 從實體中查詢
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Student"];
    // 建立實體描述
    NSEntityDescription *studentED = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.manmagerContext];
    // 設定查詢實體
    request.entity = studentED;
    
    // 設定查詢根據key和BOOL進行升序降序排列,key為排列條件,YES為升序,NO是降序
    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
    request.sortDescriptors = @[sort];
    
    // 設定查詢,根據指定條件查詢
    
//    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", @"</span><pre name="code" class="objc"><span style="font-size:18px;">東方2號"];
    // 模糊查詢,包含
//    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS %@", @"3"];
    // 不知道的地方用*代替
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE %@",@"東方*"];
    
    // 新增查詢條件
    request.predicate = predicate;
 
    // 陣列接收查詢的資料
    NSArray *array = [self.manmagerContext executeFetchRequest:request error:nil];
    // 遍歷陣列,取出資料列印
    for (Student *student in array) {
        NSLog(@"姓名:%@, 性別:%@, 年齡:%@", student.name, student.sex, student.age);
    }     
}
</span>
<span style="font-size:18px;">#pragma mark - 修改
- (IBAction)changeData:(id)sender {
    // 先查詢
    // 從實體中查詢
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Student"];
    // 建立實體描述
    NSEntityDescription *studentED = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.manmagerContext];
    // 設定查詢實體
    request.entity = studentED;
    
    // 設定查詢,根據指定條件查詢
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS %@", @"5"];
    // 新增查詢條件
    request.predicate = predicate;
    
    
    // 陣列接收查詢資料
    NSArray *array = [self.manmagerContext executeFetchRequest:request error:nil];
    // 遍歷
    for (Student *student in array) {
        student.sex = @"女";
        student.age = [NSNumber numberWithInt:999];
        NSLog(@"姓名:%@, 性別:%@, 年齡:%@", student.name, student.sex, student.age);
    }
    
    // 資料同步
    
    NSError *error = nil;
    // 資料同步
    [self.manmagerContext save:&error];
    
    if (!error) {
        NSLog(@"修改成功");
    }
    
}
</span>
<span style="font-size:18px;">#pragma mark - 刪除
- (IBAction)deleteData:(id)sender {
    // 先查詢
    // 從實體中查詢
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Student"];
    // 建立實體描述
    NSEntityDescription *studentED = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.manmagerContext];
    // 設定查詢實體
    request.entity = studentED;
    
    // 設定查詢,根據指定條件查詢
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS %@", @"6"];
    // 新增查詢條件
    request.predicate = predicate;
    
    // 陣列接收查詢資料
    NSArray *array = [self.manmagerContext executeFetchRequest:request error:nil];
    
    for (Student *student in array) {
        // 刪除
        [self.manmagerContext deleteObject:student];
    }
    
    // 資料同步
    NSError *error = nil;
    // 資料同步
    [self.manmagerContext save:&error];
    
    if (!error) {
        NSLog(@"刪除成功");
    }  
}

#pragma mark - 被管理物件上下文(臨時資料庫)的懶載入方法
- (NSManagedObjectContext *)manmagerContext
{
    if (!_manmagerContext) {
        
        // 獲取AppDelegate當中的被管理物件上下文
        _manmagerContext = ((AppDelegate *)[UIApplication sharedApplication].delegate).managedObjectContext;
    }
    return _manmagerContext;
}

@end</span>