CoreData的簡單使用

CoreData簡介

  • CoreData用于做數(shù)據(jù)的持久化.
  • CoreData不是數(shù)據(jù)庫,但它可以通過數(shù)據(jù)庫或XML等方式來存儲數(shù)據(jù),在iOS平臺上CoreData只能使用SQLite來存儲數(shù)據(jù).
  • CoreData通過面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù).
  • CoreData簡單,易用,性能好.

CoreData主要對象

  • NSManagedObjectContext: 負(fù)責(zé)應(yīng)用和數(shù)據(jù)庫之間的交互
  • NSPersistentStoreCoordinator: 添加持久化存儲庫(如SQLite),是物理數(shù)據(jù)存儲的物理文件和程序之間的聯(lián)系的橋梁.
  • NSManagedObjectModel: 被管理的對象模型,對應(yīng)定義的模型文件.
  • NSEntityDescription: 實(shí)體描述.

CoreData使用

創(chuàng)建初始化CoreData

//1 創(chuàng)建數(shù)據(jù)庫文件路徑
NSString *databaseFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/database.sqlite"];
NSURL *url = [NSURL fileURLWithPath:databaseFilePath];
//2 創(chuàng)建對象模型描述文件 描述了所儲存的對象中的屬性.
//command+n 打開新建文件界面-選擇CoreData-Data Model.
//點(diǎn)擊左下角的 Add Entity 按鈕兽间,在模型描述文件中,添加一個(gè)實(shí)體模型.
//點(diǎn)擊右下角的 Add Attribute按鈕能夠?qū)嶓w模型添加屬性正塌。然后在熟悉列表中能夠設(shè)置屬性名和類型.
//3 獲取描述文件路徑
    NSURL *entityFileURL = [[NSBundle mainBundle] URLForResource:@"User" withExtension:@"momd"];
//4 通過實(shí)體描述文件 來創(chuàng)建一個(gè)實(shí)體對象
    // 實(shí)體模型描述文件(定義了對象中的屬性)---> 創(chuàng)建模型對象
    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:entityFileURL];

//5 創(chuàng)建數(shù)據(jù)持久化協(xié)調(diào)器(PSC)
    NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
//6 創(chuàng)建數(shù)據(jù)庫實(shí)體文件NSError *error = nil;
    [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
    if (error) {
        NSLog(@"數(shù)據(jù)庫創(chuàng)建失敗");
    } else {
        NSLog(@"數(shù)據(jù)庫創(chuàng)建成功:%@", databaseFilePath);
    }
   //綁定context 用于數(shù)據(jù)管理
    _objectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    //綁定context和協(xié)調(diào)器psc
    _objectContext.persistentStoreCoordinator = psc;

插入數(shù)據(jù)

- (void)insertUser {
    //使用實(shí)體描述 來創(chuàng)建CoreData的模型對象
    //插入一個(gè)新的對象到對象上下文中去,按照相對應(yīng)說實(shí)體名來進(jìn)行創(chuàng)建
    User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:_objectContext];
    user.username = @"xiaoming2";
    user.password = @"88888888";
    user.age = @20;

    //保存模型對象到數(shù)據(jù)庫中
    NSError *error = nil;
    [_objectContext save:&error];
    if (error) {
        NSLog(@"保存出錯(cuò):%@", error);
    } else {
        NSLog(@"保存成功");
    }
}

查詢數(shù)據(jù)

- (NSArray *)fetchUserWithAge:(NSNumber *)age {
    
    //創(chuàng)建查詢請求對象
    //設(shè)置所查詢的實(shí)體對象名
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"User"];
    //設(shè)置查詢條件
    //謂詞
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age=%@", age];
    fetchRequest.predicate = predicate;
    
    //執(zhí)行查詢請求
    NSError *error = nil;
    NSArray *result = [_objectContext executeFetchRequest:fetchRequest error:&error];
    
    //處理查詢結(jié)果
    if (error) {
        NSLog(@"查詢出錯(cuò):%@", error);
    } else {
        for (User *u in result) {
            NSLog(@"name = %@, password = %@, age = %@", u.username, u.password, u.age);
        }
    }
    
    return [result copy];
}

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

- (void)deleteUser {
    
    //刪除 年齡=20的所有用戶
    //查詢數(shù)據(jù)
    NSArray *users = [self fetchUserWithAge:@(20)];
    //刪除數(shù)據(jù)
    for (User *u in users) {
        
        [_objectContext deleteObject:u];
        
    }
    //保存更改到數(shù)據(jù)庫
    BOOL saveSuccess = [_objectContext save:nil];
    if (saveSuccess) {
        NSLog(@"保存成功");
    } else {
        NSLog(@"保存失敗");
    }
}

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

- (void)updateUser {
    
    //將年齡=18歲的用戶 密碼改為123456
    
    //查詢數(shù)據(jù)
    NSArray *users = [self fetchUserWithAge:@(18)];
    //修改數(shù)據(jù)
    for (User *u in users) {
        u.password = @"123456";
    }
    //保存修改之后數(shù)據(jù)
    BOOL saveSuccess = [_objectContext save:nil];
    if (saveSuccess) {
        NSLog(@"保存成功");
    } else {
        NSLog(@"保存失敗");
    }
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渡八,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子传货,更是在濱河造成了極大的恐慌屎鳍,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件问裕,死亡現(xiàn)場離奇詭異逮壁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)粮宛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門窥淆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人巍杈,你說我怎么就攤上這事忧饭。” “怎么了筷畦?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵词裤,是天一觀的道長刺洒。 經(jīng)常有香客問我吼砂,道長逆航,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任渔肩,我火速辦了婚禮,結(jié)果婚禮上周偎,老公的妹妹穿的比我還像新娘抹剩。我一直安慰自己澳眷,他們只是感情好灶平,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逢享,像睡著了一般罐监。 火紅的嫁衣襯著肌膚如雪弓柱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天侧但,我揣著相機(jī)與錄音矢空,去河邊找鬼。 笑死禀横,一個(gè)胖子當(dāng)著我的面吹牛屁药,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柏锄,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼酿箭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了趾娃?” 一聲冷哼從身側(cè)響起缭嫡,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抬闷,沒想到半個(gè)月后妇蛀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年讥耗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了有勾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡古程,死狀恐怖蔼卡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挣磨,我是刑警寧澤雇逞,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站茁裙,受9級特大地震影響塘砸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晤锥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一掉蔬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矾瘾,春花似錦女轿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至放妈,卻和暖如春北救,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芜抒。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工珍策, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宅倒。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓攘宙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親唉堪。 傳聞我的和親對象是個(gè)殘疾皇子模聋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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