CoreData初級使用教程

iOS中的CoreData用起來很是方便朗徊,比起SQLite又臭又長而且容易出錯的語句簡直不能再好用,這也是蘋果官方推薦使用的株旷。今天抽空寫個教程給大家參考,也方便自己溫故知新尔邓。


一晾剖、準備工作

首先在建立工程時在“use Core Data”前面打鉤


建立工程

這樣系統(tǒng)就會生成一個coreData相關(guān)的文件

coreData文件

然后我們點開這個類就會發(fā)現(xiàn)是一個表格結(jié)構(gòu)的東東,這就是coreData的可視化建模铃拇,也是有一定逼格的钞瀑。
然后我們點擊左下方的Add Entity建立實體(可以理解為我們經(jīng)常創(chuàng)建的類),并添加幾個屬性

CoreData可視化界面

好了慷荔,接下來就是CoreData牛逼的地方,我們選中CoreData對應(yīng)的文件然后選擇Xcode工具欄中的Editor->Create NSManagedObject Subclass...,系統(tǒng)就會生成該實體對應(yīng)的類

Create NSManagedObject Subclass
生成的類
二显晶、正式使用

系統(tǒng)幫我們生成的類里面該有的不該有的系統(tǒng)已經(jīng)幫我們弄好了贷岸,我們只管用就行了。接下來在要使用的類的頭文件中導(dǎo)入該類以及appDelegate.h(方便調(diào)用CoreData方法)

#import "ViewController.h"
#import "AppDelegate.h"
#import "Person.h"


@interface ViewController ()<UITableViewDelegate,UITableViewDataSource,UIGestureRecognizerDelegate>

@property (weak, nonatomic) IBOutlet UITableView *tableView;

//用該屬性調(diào)用CoreData命令
@property(nonatomic,strong)AppDelegate *appDelegate;
//存放要顯示的數(shù)據(jù)
@property(nonatomic,strong)NSMutableArray *mutableArray;

@end

為了方便操作以及顯示磷雇,我是通過storyboard給界面添加了一個增加數(shù)據(jù)的按鈕偿警,當然也可以直接用代碼添加

storyboard中添加按鈕
tableView代理方法
//分區(qū)數(shù)
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    
    return 1;
}
//每個分區(qū)下的行數(shù)

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    
    return self.mutableArray.count;
}


//定義cell內(nèi)容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    //由于這里只是顯示,所以不存在與CoreData交互
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    
    Person *person = self.mutableArray[indexPath.row];
    cell.textLabel.text = [NSString stringWithFormat:@"姓名:%@,年齡%@",person.name,person.age];
    cell.detailTextLabel.text = [NSString stringWithFormat:@"性別:%@",person.gender];
    return cell;
    
}


增刪改查操作

1 添加數(shù)據(jù)(按鈕的回調(diào)方法)

//添加數(shù)據(jù)
- (IBAction)addData:(id)sender {
    
    //建立一個實體描述文件
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.appDelegate.managedObjectContext];
    //通過描述文件創(chuàng)建一個實體
    Person * person = [[Person alloc]initWithEntity: entityDescription insertIntoManagedObjectContext:self.appDelegate.managedObjectContext];
    
    person.name = @"帥哥";
    person.gender = @"男";
    
    //隨機生成一個年齡
    int age = arc4random()%20 + 1;
    person.age  = [NSNumber numberWithInt:age];
    //添加到數(shù)據(jù)中
    [self.mutableArray insertObject:person atIndex:0];

    //調(diào)用持久化save方法保存到CoreData中
    [self.appDelegate saveContext];
    //添加到UI下面這句寫成[self.tableView reloadData]也可以
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationLeft];
    
}


2刪除數(shù)據(jù)

//滑動后紅色刪除按鈕上顯示的文字
-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    return @"刪除";
}

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    
    //刪除情況下
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        
        Person *person = self.mutableArray[indexPath.row];
        [self.mutableArray removeObject:person];
        [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        
        //刪除CoreData中的數(shù)據(jù)
        [self.appDelegate.managedObjectContext deleteObject:person];
        
        //持久化一下
        [self.appDelegate saveContext];

    }
  
}

3修改數(shù)據(jù)


//修改數(shù)據(jù)
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    Person *person = self.mutableArray[indexPath.row];

    if ([person.gender isEqualToString:@"男"]) {
        
    person.gender = @"女";
    person.name = @"新名字";
    [self.appDelegate saveContext];
    

    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];

    }
    
    //詞句代碼作用為點擊cell后的點擊效果完成之后會消失唯笙,不會一直顯示選中狀態(tài)
    [self.tableView  deselectRowAtIndexPath:indexPath animated:YES];
    
}

4查詢數(shù)據(jù)
查詢數(shù)據(jù)這塊螟蒸,CoreData簡直太6了,輸入fet三個字母后然后根據(jù)系統(tǒng)提示按回車瞬間系統(tǒng)給你提供了半個屏幕的代碼崩掘,簡直太良心了七嫌,我們只需要把相關(guān)信息填進去就行

查詢方法
    //查詢數(shù)據(jù)
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.appDelegate.managedObjectContext];
    [fetchRequest setEntity:entity];
    // Specify criteria for filtering which objects to fetch
//謂詞搜索
//    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age = 21", ];
//    [fetchRequest setPredicate:predicate];
    // Specify how the fetched objects should be sorted
//排序方法(這里為按照年齡升序排列)
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];
    
    NSError *error = nil;
    NSArray *fetchedObjects = [self.appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (fetchedObjects == nil) {
        NSLog(@"數(shù)據(jù)查詢錯誤%@",error);
    }else{

        //查詢到之后要你的操作代碼
     
    }
其他:
viewDidLoad中需要做的事情

估計很多人在做完以上操作后發(fā)現(xiàn)重新運行程序后界面上不顯示數(shù)據(jù),很大一部分原因是沒有在viewDidLoad中將CoreData中的數(shù)據(jù)添加到數(shù)據(jù)源中苞慢,即诵原,上述查詢方法需在viewDidLoad中執(zhí)行一次并添加到數(shù)據(jù)源中以供顯示

  //初始化
    self.appDelegate = [UIApplication sharedApplication].delegate;
    self.mutableArray = [NSMutableArray array];

//給數(shù)據(jù)源添加數(shù)據(jù)

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.appDelegate.managedObjectContext];
    [fetchRequest setEntity:entity];
    // Specify criteria for filtering which objects to fetch
    //    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age = 21", ];
    //    [fetchRequest setPredicate:predicate];
    // Specify how the fetched objects should be sorted
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];
    
    NSError *error = nil;
    NSArray *fetchedObjects = [self.appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (fetchedObjects == nil) {
        NSLog(@"數(shù)據(jù)查詢錯誤%@",error);
    }else{
        //將查詢到的數(shù)據(jù)添加到數(shù)據(jù)源中
        [self.mutableArray addObjectsFromArray:fetchedObjects];
    }

    
運行結(jié)果
三、調(diào)試(查看語句執(zhí)行情況)

有些同學可能想看一下代碼執(zhí)行情況挽放,這樣也有助于調(diào)試绍赛,我們可以按照以下設(shè)置

設(shè)置步驟1
設(shè)置步驟2
添加兩個屬性: "-com.apple.CoreData.SQLDebug"和“1”

這樣設(shè)置完成之后,如果CoreData數(shù)據(jù)有變動辑畦,相關(guān)語句會在控制臺打印出來

控制臺內(nèi)容

OVER

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吗蚌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纯出,更是在濱河造成了極大的恐慌蚯妇,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潦刃,死亡現(xiàn)場離奇詭異侮措,居然都是意外死亡,警方通過查閱死者的電腦和手機乖杠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門分扎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胧洒,你說我怎么就攤上這事畏吓。” “怎么了卫漫?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵菲饼,是天一觀的道長。 經(jīng)常有香客問我列赎,道長宏悦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮饼煞,結(jié)果婚禮上源葫,老公的妹妹穿的比我還像新娘。我一直安慰自己砖瞧,他們只是感情好息堂,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著块促,像睡著了一般荣堰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竭翠,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天振坚,我揣著相機與錄音,去河邊找鬼逃片。 笑死屡拨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的褥实。 我是一名探鬼主播呀狼,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼损离!你這毒婦竟也來了哥艇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤僻澎,失蹤者是張志新(化名)和其女友劉穎貌踏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窟勃,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡祖乳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了秉氧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眷昆。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖汁咏,靈堂內(nèi)的尸體忽然破棺而出亚斋,到底是詐尸還是另有隱情,我是刑警寧澤攘滩,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布帅刊,位于F島的核電站,受9級特大地震影響漂问,放射性物質(zhì)發(fā)生泄漏赖瞒。R本人自食惡果不足惜女揭,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冒黑。 院中可真熱鬧田绑,春花似錦勤哗、人聲如沸抡爹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冬竟。三九已至,卻和暖如春民逼,著一層夾襖步出監(jiān)牢的瞬間泵殴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工拼苍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笑诅,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓疮鲫,卻偏偏與公主長得像吆你,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俊犯,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容