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的修改,否则就会出现使用数据库时崩溃的问题

  • 相关阅读:
    html5+css3中的background: -moz-linear-gradient 用法 (转载)
    CentOS 安装Apache服务
    Linux 笔记
    CURL 笔记
    Spring Application Context文件没有提示功能解决方法
    LeetCode 389. Find the Difference
    LeetCode 104. Maximum Depth of Binary Tree
    LeetCode 520. Detect Capital
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 136. Single Number
  • 原文地址:https://www.cnblogs.com/swallow37/p/3600253.html
Copyright © 2011-2022 走看看