免費開源的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


                                                欧美超级精品一级A片|欧美一级黄色视频|国产精品自在在线午夜免费|4444亚洲人成无码网在线观看|亚洲ⅴa曰本va欧美va视频