免費開源的iOS開發學習平臺

Core Data入門:2-使用示例

本節會以添加/刪除一個名為Person的實體為例,講解Core Data的使用方法。

添加實體

創建一個項目,在創建項目的選項中,注意勾選【Use Core Data】選項。

在創建好的工程里面,我們能找到一個以.xcdatamodeld結尾的文件,該文件是用于配置Core Data數據模型的文件。

單擊打開這個文件,你會看到Xcode已經提供了一個強大的數據模型編輯器。

![屏幕快照 2016-12-19 下午1.44.03](http://tempdusty.qiniudn.com/2016-12-19-屏幕快照 2016-12-19 下午1.44.03.png)

現在我們可以點擊下方的【Add Entity】來添加一個實體Person。

![屏幕快照 2016-12-19 下午1.45.54](http://tempdusty.qiniudn.com/2016-12-19-屏幕快照 2016-12-19 下午1.45.54.png)

接下來我們來給Person添加一個屬性,一個名稱為name的屬性,其類型是字符串。
![屏幕快照 2016-12-19 下午1.58.48](http://tempdusty.qiniudn.com/2016-12-19-屏幕快照 2016-12-19 下午1.58.48.png)

點擊Xcode的Editor菜單,選中【Create NSManagedObject Subclass...】來添加實體類。
![屏幕快照 2016-12-19 下午2.33.22](http://tempdusty.qiniudn.com/2016-12-19-屏幕快照 2016-12-19 下午2.33.22.png)

另外,在編譯選項中添加CoreData.framework,并且刪除Compile Sources中的Person+CoreDataClass.m,否則會編譯不過。

![屏幕快照 2016-12-19 下午2.20.40](http://tempdusty.qiniudn.com/2016-12-19-屏幕快照 2016-12-19 下午2.20.40.png)

![屏幕快照 2016-12-19 下午2.48.43](http://tempdusty.qiniudn.com/2016-12-19-屏幕快照 2016-12-19 下午2.48.43.png)

準備工作

在ViewController.m中引入需要使用的其他類的頭文件,并且添加如下的屬性。

#import <CoreData/CoreData.h>
#import "AppDelegate.h"
#import "ViewController.h"
#import "Person+CoreDataClass.h"
@interface ViewController ()<UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (nonatomic, strong) UIAlertController *alert;
@property (nonatomic, strong) NSMutableArray<Person *> *personList;
@end

查詢數據

在viewDidLoad方法中,添加如下的代碼,可以實現當用戶打開APP時,會自動從管理對象上下文中獲取存儲的數據,并顯示到UITableView中。這里需要掌握Core Data的查詢方法。

- (void)viewDidLoad {
    [super viewDidLoad];
    // 1. 獲取NSManagedObjectContext對象
    AppDelegate *appDelegate = (id)[UIApplication sharedApplication].delegate;
    NSManagedObjectContext *context = appDelegate.persistentContainer.viewContext;
    // 2. 生成一個Person的查詢對象
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
    // 3. 設置查詢對象排序描述符,這樣能使得查詢的結果按照我們的需要排序
    NSSortDescriptor * sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    NSArray * sortDescriptors = [NSArray arrayWithObject: sort];
    fetchRequest.sortDescriptors = sortDescriptors;
    // 4. 設置查詢條件,我們這邊直接返回TRUE,表示查詢所有數據
    NSPredicate *predicate = [NSPredicate predicateWithValue:YES];
    fetchRequest.predicate = predicate;
    // 5. 執行查詢語句,并更新tableview的顯示
    NSArray * results = [context executeFetchRequest:fetchRequest error:nil];
    [self.personList addObjectsFromArray:results];
    //更新表視圖
    [self.tableView reloadData];
}

添加數據

當我們創建完實體后,就可以實例化實體對象,并添加到管理對象上下文中。下方的示例代碼中,創建Person實體并添加到預先創建的管理對象上下文中。

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [self.alert dismissViewControllerAnimated:YES completion:^{
        NSLog(@"%@", textField.text);
        // 1. 獲取NSManagedObjectContext對象
        AppDelegate *appDelegate = (id)[UIApplication sharedApplication].delegate;
        NSManagedObjectContext *context = appDelegate.persistentContainer.viewContext;
        // 2. 創建Person實體描述
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person"
                                                  inManagedObjectContext:context];
        // 3. 創建一個Person實體
        Person *person = (id)[[NSManagedObject alloc] initWithEntity:entity
                                      insertIntoManagedObjectContext:context];
        person.name = textField.text;
        // 4. 添加Person實體到UITableView數據源
        [self.personList addObject:person];
        
    }];
    self.alert = nil;
    
    return YES;
}

更新數據

Core Data修改數據相對比較簡單了。只需要查詢出需要修改數據的Person實體,然后直接修改其值就可以了。例如,我們修改最后一行的數據。在這個過程中,由于Person類是Core Data中的實體對象,因此我們可以對對象直接修改賦值,而無需像SQLite中一樣,先查詢出對應的數據,然后再修改。

- (IBAction)editLastOne:(id)sender {
    NSLog(@"修改最后一行");
    Person *person = self.personList.lastObject;
    person.name = [NSString stringWithFormat:@"已修改:%@", person.name];
}

刪除數據

與更新數據類似,在Core Data中,刪除數據也是針對對象直接操作的。在NSManagedObjectContext類中,提供了deleteObject:方法,用于刪除管理對象上下文中的對象。

- (IBAction)deleteLastOne:(id)sender {
    NSLog(@"刪除最后一行");
    // 1. 獲取最后一個Person對象
    Person *person = self.personList.lastObject;
    // 2. 獲取NSManagedObjectContext對象
    AppDelegate *appDelegate = (id)[UIApplication sharedApplication].delegate;
    NSManagedObjectContext *context = appDelegate.persistentContainer.viewContext;
    [context deleteObject:person];
    // 3. 判斷Person對象如果被刪除,則從self.personList中把它移除。隨后更新表視圖
    if ([person isDeleted]) {
        [self.personList removeObject:person];
    }
    [self.tableView reloadData];
}

示例代碼

https://github.com/99ios/13.7


日韩av 中文字幕 1_亚洲第一区在线_亚洲V日韩V精品v无码专区_色鬼久久亚洲AV综合