Xcode8, MagicalRecord使用

MagicalRecord 库的github地址
github https://github.com/magicalpanda/MagicalRecord

1、用cocoa pods下载

pod 'MagicalRecord'

2、为项目添加 CoreData.FrameWork

(点工程根节点,然后依次 Targets > Build Phases > Link Binary With Libraries > + > CoreData.framework > 添加 ),
然后在文件需要使用到 MagicalRecord 库的地方:

#import <MagicalRecord/MagicalRecord.h> 

3、建立模型

做一个比方,这里建一个Person模型,属性有3个,name,age,work。然后进行相应的增删查改操作.

  • 建立一个Data Model, 名字自取,我这里名字是 TestModel,然后 就会多了箭头2所指的这个文件。


    奋斗的七月
  • 建立模型Person,并添加属性。 首先选择TestModel ,然后点击坐下角的 Add Entity ,再修改成Person,再分别添加Person的三个属性,name , work ,age ,并给它们的type设置成string 、string 、integer 16,另外着重看第5点(箭头指向的地方) 这个是要设置成OC语言的,当然如果是swift语言就另说,这是和Xcode8之前的版本不同的地方.


    奋斗的七月
  • 接下来是建模,建模也和之前的版本不同,不是之前的方法建模了,建模的地方放置到了这里:


    奋斗的七月
  • 点了一路的确定之后,将会出现这4个文件,然后我们在需要使用到Person模型的地方导入 #import "Person+CoreDataClass.h" .


    奋斗的七月

4、MagicalRecord使用

在 AppDelegate.m 文件的 - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions 初始化

// 对Magical Record的初始化
    [MagicalRecord setupCoreDataStackWithStoreNamed:@"YJH.sqlite"];
添加功能
// 创建记录
- (void)createData {
     Person *person = [Person MR_createEntity];
     person.firstName = @"张";
     person.lastName = @"三";
     person.age = @25;
     [[NSManagedObjectContext MR_defaultContext]     MR_saveToPersistentStoreAndWait];
}
查询功能
// 查询记录
- (void)findData {
     // 查找数据库中的所有数据
     NSArray *person = [Person MR_findAll];
     // 查找所有的Person并按照firstName排序
     NSArray *personSorted = [Person MR_findAllSortedBy:@"firstName" ascending:YES];
     // 查找所有的age属性为25的Person记录
     NSArray *personAgeEqual25 = [Person MR_findByAttribute:@"age" withValue:[NSNumber numberWithInt:25]];
     // 查找数据库中的第一条记录
     Person *personFirst = [Person MR_findFirst];

     NSLog(@"%@  %@  %@  %@", person, personSorted, personAgeEqual25, personFirst);

     // 查找数据库中的第一条记录的全名
     personFirst = [Person MR_findFirst];
     NSLog(@"personName:%@%@", personFirst.firstName, personFirst.lastName);
}
修改功能
// 更新记录
- (void)updateData {
     NSArray *personArr = [Person MR_findByAttribute:@"age" withValue:    [NSNumber numberWithInt:25]];
     NSEnumerator *keyEnumerator;
     keyEnumerator = [personArr objectEnumerator];
     Person *person;
     while (person = [keyEnumerator nextObject]) {
          person.firstName = @"李";
     }

     for (Person *person in personArr) {
          person.lastName = @"四";
     }

     [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
}
删除功能
// 删除记录
- (void)deleteData {
     NSArray *personArr = [Person MR_findByAttribute:@"age" withValue:   [NSNumber numberWithInt:25]];
     for (Person *person in personArr) {
         [person MR_deleteEntity];
     }

     [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
}

5、总结

稍稍总结了一下 ,用 MagicalRecord 来作为本地数据库存储是很方便,避免了写很多配置,只需要几行代码就能够完成项目的需求,另外标注一下,只有在读取数据的时候是不需要做保存操作的,其它的对数据库的操作是都需要在完成的时候,使用下面这行代码来进行保存。

[[NSManagedObjectContextMR_defaultContext]MR_saveToPersistentStoreAndWait]; 

3个小技巧

启动时MR_mergedObjectModelFromMainBundle方法报错

Core Data的模型有版本的概念,有可能在你Magical Record第一次初始化完成以后,你又更改了模型文件,导致Core Data去合并模型报错。解决办法很简单,点击菜单中的Project->Clean即可。

项目使用ARC后,编译Magical Record不通过

点击项目 -> Build Phases -> Compile Sources中, 双击报错的class文件, 编辑Compiler Flags加入 -fno-objc-arc。

不想使用MR_前缀

只需要在*-Prefix.pch文件中添加一句#define MR_SHORTHAND即可,注意这句要在#import “CoreData+MagicalRecord.h”之前。

项目实例

1.新建并存储

#pragma mark - 加载科室列表
-(void)loadDepartmentInfo
{
    YJHDepartmentInfo *departmentModel = [YJHDepartmentInfo new];
    [departmentModel networkingSuccess:^(id result) {
        
        HTResults *mResult = result;
        YJHDeparmentResponseInfo *info = [YJHDeparmentResponseInfo new];
        info.list = mResult.data[@"list"];

        [MagicalRecord saveWithBlock:^(NSManagedObjectContext * _Nonnull localContext) {
            
            NSArray* mArray = [CDDepartmentInfo MR_findAllInContext:localContext];
            for (CDDepartmentInfo* item in mArray) {
                [item MR_deleteEntityInContext:localContext];
            }
            
            [CDDepartmentInfo mj_objectArrayWithKeyValuesArray:info.list context:localContext];

        } completion:^(BOOL contextDidSave, NSError * _Nullable error) {
        DDLog(@"存储完成");
        }];
        
    } failed:^(NSString *error) {
        DDLog(@"failed");
    }];
}

2.查找

CDDepartmentInfo *departmentInfo = [CDDepartmentInfo MR_findFirstWithPredicate:[NSPredicate predicateWithFormat:@"departmentId like %@",_personInfo.departmentId]];

3.查找并排序

 NSArray *carrMonitor = [CDMonitorInfo MR_findAllSortedBy:@"kindId" ascending:YES];

4.更新数据

#pragma mark - 把新的体重身高插入输数据库
-(void)insertHeightAndWeightInSQL
{
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext * _Nonnull localContext) {
        CDPersonInfo* userInfoCD = [CDPersonInfo MR_findFirstInContext:localContext];
        userInfoCD.height = [NSString stringWithFormat:@"%.2f",[self.personHeight floatValue]];
        userInfoCD.weight = [NSString stringWithFormat:@"%.2f",[self.personWeight floatValue]];
    } completion:^(BOOL contextDidSave, NSError * _Nullable error) {
        DDLog(@"更新成功");
}

5.清空数据

 NSArray *carrMonitor  = [CDNoReadMessageInfo MR_findAll];
    for (CDNoReadMessageInfo *noReadMessageInfo in carrMonitor) {
        [noReadMessageInfo MR_deleteEntity];
    }
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容