Core Data學習筆記二:創(chuàng)建NSManagedObject對象

NSManagedObject

上篇文章Core Data學習筆記一:創(chuàng)建CoreDataStack創(chuàng)建了Data Model 文件,并且創(chuàng)建了一些實例Entity 如果說,可視化Data Model文件在程序中,對應了NSManagedModel對象,這些Entity在程序中,所對應的對象就是NSManagedObject (當然其實并不完全對等,可以先這么理解)

Document

NSManagedObject is a generic class that implements all the basic behavior required of a Core Data model object. It is not possible to use instances of direct subclasses of NSObject (or any other class not inheriting from NSManagedObject) with a managed object context. You may create custom subclasses of NSManagedObject, although this is not always required. If no custom logic is needed, a complete Object graph can be formed with NSManagedObject instances.

這里大概有三個要點

  • NSManagedObject 代表了Data Model中的對象
  • NSManagedObject 需要和 NSManagedObjectContext 結(jié)合使用才有意義
  • NSManagedObject 滿足所有你自定義的model 對象需求,通過KVC 去訪問相應的屬性

生成NSManagedObject子類

雖然通過KVC就可以訪問NSManagedObject所有的屬性,但這樣使用起來不是很方便。

在Xcode Data Model Editor 中選中你要創(chuàng)建NSManagedObject子類的實例,在右側(cè)Data Model Inspector中選擇Codegen

1.png
  • Manual/None
  • Category/Extension.
  • Class Definition

Manual/None is the default, and previous behavior; in this case you should implement your own subclass or use NSManagedObject.

這個是iOS10以前的默認行為,需要我們手動通過Xcode Editor-> Create NSManagedObject SubClass... 生成ClassName+CoreDataClass 文件以及 ClassName+CoreDataGeneratedProperties 其中前者,是類的定義,以及類行為定義,后者通過category 定義了類的屬性(注:Objective-C中Category定義屬性不支持生成成員變量,但可以生成get set 方法,CoreData屬性通過@dynamic修飾,表示,運行時生成 get set 方法)

當每次修改,data model的時候,重新通過以上方法,生成NSManagedObject對象,系統(tǒng)只會覆蓋ClassName+CoreDataGeneratedProperties文件,而不會修改ClassName+CoreDataClass 文件。

Category/Extension generates a class extension in a file named like ClassName+CoreDataGeneratedProperties. You need to declare/implement the main class (if in Obj-C, via a header the extension can import named ClassName.h).

一般情況下,因為我們不需要修改屬性Category的定義,而只需要修改類行為的定義,所以這個選項,就直接不對開發(fā)者暴露Category 文件,當你修改了DataModel的時候,就可以自動同步最新的代碼

Class Definition generates subclass files named like ClassName+CoreDataClass as well as the files generated for Category/Extension.

當我們也不需要為NSManagedObject定義行為的時候,我們就可以選中這個選項,然后直接在項目里引用頭文件就可以直接使用。

數(shù)據(jù)庫 增刪改查

增加一個數(shù)據(jù)庫對象,首先,需要創(chuàng)建一個NSEntityDescription,前面說 Data Model Editor 里的實例并不完全和NSManagedObject對等,就是因為創(chuàng)建NSManagedObject對象,還需要entity相關(guān)的描述對象,這個對象才與實例對等。

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Doge" inManagedObjectContext:_context];
Doge *doge = [[Doge alloc] initWithEntity:entity insertIntoManagedObjectContext:_context];
doge.name = @"xxx";
...
...
//注意,這里并沒有實際把對象存入數(shù)據(jù)庫,實際存入需要調(diào)用NSManagedObjectContext 的save:方法
[_context save:nil];

直接訪問NSManagedObject屬性的set方法,就可以修改屬性,同時,也只有當調(diào)用了NSManagedObjectContext 的-save:方法后才能存入實際的存儲文件中

刪除調(diào)用NSManagedObjectContext-deleteObject:方法,然后調(diào)用-save:方法

 Doge *doge = ...
 [_context deleteObject:doge];
 [_context save:nil]

查 會單獨寫一篇學習筆記:)

Demo

添加數(shù)據(jù)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [self importSeedJsonSeedIfNeeded];
    return YES;
}
- (void)importSeedJsonSeedIfNeeded {
    
    NSManagedObjectContext *context = [[MTCoreDataStack sharedInstance] managedContext];
    
    NSFetchRequest * fetchRequest = [Master fetchRequest];
    fetchRequest.resultType = NSCountResultType;
    
    NSError *error;
    NSArray *results = [context executeFetchRequest:fetchRequest error:&error];
    if (!error) {
        if ([results count] > 0) {
            NSInteger masterCount = [[results objectAtIndex:0] integerValue];
            if (masterCount <= 0) {
                [self importJsonSeed];
            }
        } else {
            [self importJsonSeed];
        }
        
    }else {
        [self importJsonSeed];
    }
    
}

- (void)importJsonSeed {
    NSURL *jsonURL = [[NSBundle mainBundle] URLForResource:@"seed" withExtension:@"json"];
    
    NSError *error;
    NSData *jsonData = [NSData dataWithContentsOfURL:jsonURL options:0 error:&error];
    
    if (!error) {
        NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
        if (!error) {
            
            NSManagedObjectContext *context = [[MTCoreDataStack sharedInstance] managedContext];
            
            NSEntityDescription *masterEntity = [NSEntityDescription entityForName:@"Master" inManagedObjectContext:context];
            NSEntityDescription *dogeEntity = [NSEntityDescription entityForName:@"Doge" inManagedObjectContext:context];
            
            NSDictionary *masterDict = jsonDict[@"master"];
            if (![masterDict isKindOfClass:[NSDictionary class]]) {
                return;
            }
            
            Master *master = [[Master alloc] initWithEntity:masterEntity insertIntoManagedObjectContext:context];
            master.name = masterDict[@"name"];
            master.age = [masterDict[@"age"] integerValue];
        
            NSArray *doges = jsonDict[@"doges"];
            
            for (NSDictionary *dogeDict in doges) {
                if (![dogeDict isKindOfClass:[NSDictionary class]]) {
                    continue;
                }
                Doge *doge = [[Doge alloc] initWithEntity:dogeEntity insertIntoManagedObjectContext:context];
                doge.name = dogeDict[@"name"];
                doge.age = [dogeDict[@"age"] integerValue];
                doge.master = master; //因為在DataModel 里設(shè)置了 inverse, 所以master 和 doge可以相互關(guān)聯(lián)上
            }
            //一定要調(diào)用 save 方法,才能真正的將文件存入數(shù)據(jù)庫
            [[MTCoreDataStack sharedInstance] saveContext];
        }
    }
}

源碼下載

https://github.com/mengtian-li/CoreDataStackDemo/releases/tag/v0.2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

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

  • 本文是對 MagicalRecord github上的翻譯 正文:注意: MagicalRecord 在 ARC...
    騂躍神話閱讀 2,026評論 1 5
  • 適讀對象: 需要入門Core Data的朋友; 像我一樣,尚未學過數(shù)據(jù)庫相關(guān)課程,不太懂怎么寫SQLite語句的朋...
    AntonyWong閱讀 5,290評論 8 21
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • 2017年不知不覺走到了尾聲,僅剩最后一個月,似乎大家都開始慌亂了,回看年初的計劃,實現(xiàn)了多少呢? 不管過去的11...
    田心小妹閱讀 1,072評論 2 5
  • 春 東風隱沒沉沉的夢 手指觸不到似曾相識的臉 夜空驚現(xiàn)幾聲驚雷 想必這便是怦然心動的朗春 夏 暖風吹開楊柳綠 帶來...
    概念系閱讀 282評論 0 0