zoukankan      html  css  js  c++  java
  • 数据库操作iOS库MagicalRecord操作CoreData

    前言

    CoreData是iOS开发中经常使用的数据持久化的技术。但其操作过程稍微繁琐,即使你只是实现简单的存取,不涉及请求优化,也要进行许多配置工作,代码量在动辄几十行,对新手来说也需要较大时间成本。

    MagicalRecord是OC的一个库,协助方便CoreData的工作。其吸收了Ruby on Rails的Active Record模式,目标是:

    • 简化Core Data相关代码
    • 允许清晰,简单,单行获取
    • 当需要优化请求的时候,仍然允许修改NSFetchRequest

    安装

    1、在 github 上下载MagicalRecord(https://github.com/magicalpanda/MagicalRecord/blob/develop/Docs/Fetching.md)

    2、下载完成,将MagicalRecord 文件夹拖到Xcode中,添加进项目。添加CoreData framework。

    3、在PCH文件中添加 CoreData+MagicalRecord.h

    4、Option: 如果你在使用MagicalRecord方法的时候不想带MR_ 前缀,e.g. 直接用findAll 代替 MR_findAll,就在PCH中在CoreData+MagicalRecord.h之前增加 #defin MR_SHORTHAND 即可。

    5、增加CoreData.framework

    环境需求

    MagicalRecord 需要的环境:

    • iOS 5.x 及以上, Mac OS 10.7及以上
    • ARC

    iOS4,无ARC ,可以使用兼容版本,1.8.3

    用法

    创建Model

    创建一个Model.xcdatamodeld ,添加一个Person Entity,添加age firstname lastname 三个属性。最后使用News File >Core Data->  NSManagedObject Subclass生成Person类。

    初始化

    在AppDelegate中:

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    {
        //[MagicalRecordcleanUp];

        //[MagicalRecordsetDefaultModelNamed:[NSStringstringWithFormat:@"myid.momd"]];//需要创建多个存储的时候 比如不同帐号的聊天记录
    
    
        //[MagicalRecord setupCoreDataStackWithStoreNamed:@"Model.sqlite"];//修改表(加字段 加新表 删除等)之后 升级会崩溃
       [MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"Model.sqlite"];
        // ...
        return YES;
    }
    
    - (void)applicationWillTerminate:(NSNotification *)aNotification
    {
        [MagicalRecord cleanUp];
    }

    这样就搞定初始化啦!!

    Person *person = [Person MR_createEntity];
    person.firstname = @"Frank";
    person.lastname = @"Zhang";
    person.age = @26;
    [[NSManagedObjectContext MR_defaultContext] MR_save];

    或者
     [MagicalRecordsaveUsingCurrentThreadContextWithBlockAndWait:^(NSManagedObjectContext *localContext) {
                Person*person= [Person MR_createInContext:localContext];//
                person.firstname = @"Frank";
                person.lastname = @"Zhang";
                person.age = @26;
    }];//等待

    //查找数据库中的所有Person。
    NSArray *persons = [Person MR_findAll];
    
    //查找所有的Person并按照first name排序。
    NSArray *personsSorted = [Person MR_findAllSortedBy:@"firstname" ascending:YES];
    
    //查找所有age属性为25的Person记录。
    NSArray *personsAgeEuqals25   = [Person MR_findByAttribute:@"age" withValue:[NSNumber numberWithInt:25]];
    
    //查找数据库中的第一条记录
    Person *person = [Person MR_findFirst];

    或者
    NSPredicate * predicate = [NSPredicatepredicateWithFormat:@"firstname==[c]%@ AND lastname==[c]%@",@"Frank",@"Zhang"];

    Person * person = [person MR_findFirstWithPredicate:predicate];//第一个满足条件的
     

    Person *person = ...;//此处略
    person.lastname = object;        
    [[NSManagedObjectContext MR_defaultContext] MR_save];

    或者
    NSPredicate * predicate = [NSPredicatepredicateWithFormat:@"firstname==[c]%@ AND lastname==[c]%@",@"Frank",@"Zhang"]; 

    Person * person = [person MR_findFirstWithPredicate:predicate];//第一个满足条件的
    if(person)//存在
    {
    person.lastname = @"aaa";
    }

    Person *person = ...;//此处略
    [person MR_deleteEntity];
    [[NSManagedObjectContext MR_defaultContext] MR_save];

    或者
    [MagicalRecordsaveUsingCurrentThreadContextWithBlockAndWait:^(NSManagedObjectContext *localContext) {

    NSPredicate * predicate = [NSPredicatepredicateWithFormat:@"firstname==[c]%@ AND lastname==[c]%@",@"Frank",@"Zhang"];

    Person * person = [person MR_findFirstWithPredicate:predicate];//第一个满足条件的
    if(person)//存在
    {
    [person MR_deleteInContext:localContext];
    }

    }];

    升级问题:

    CoreData的模型文件修改升级之后打不开sqlite文件的情况,具体的修改其实是在某一个表里面加入了一个字段或有新表

    具体处理办法:在修改xcdatamodel文件之前,选择xcdatamodeld文件,从菜单栏选择Editor->Add Model Version,在弹出窗做好命名(不要含空格)及选择base之后结束,这个时候project navigator里面xcdatamodel变成了一个目录的样式,下面会有原来的xcdatamodel和新创建的xcdatamodel版本,选择这里的xcdatamodel目录,再打开file inspector,在Model Version区域设置current版本,然后删除老的类,在新model新新建同时在该版本上面进行core data的修改,否则就会出现使用数据库时崩溃的问题

  • 相关阅读:
    Educational Codeforces Round 85 D. Minimum Euler Cycle(模拟/数学/图)
    Educational Codeforces Round 85 C. Circle of Monsters(贪心)
    NOIP 2017 提高组 DAY1 T1小凯的疑惑(二元一次不定方程)
    Educational Codeforces Round 85 B. Middle Class(排序/贪心/水题)
    Educational Codeforces Round 85 A. Level Statistics(水题)
    IOS中的三大事件
    用Quartz 2D画小黄人
    strong、weak、copy、assign 在命名属性时候怎么用
    用代码生成UINavigationController 与UITabBarController相结合的简单QQ框架(部分)
    Attempting to badge the application icon but haven't received permission from the user to badge the application错误解决办法
  • 原文地址:https://www.cnblogs.com/swallow37/p/3600253.html
Copyright © 2011-2022 走看看