美文网首页寒哥管理的技术专题iOS开发iOS 干货整理
MagicalRecord(基于Core Data的数据持久化)

MagicalRecord(基于Core Data的数据持久化)

作者: 夜3033 | 来源:发表于2017-03-14 21:16 被阅读205次

    开篇

    这篇文章主要介绍的是基于Core Data的数据持久化的一种第三方库,在新建Cocoa Application的向导中,有一个选项是要不要使用Core Data,当启用以后你会发现在AppDelegate.m中添加了大量与Core Data相关的代码。但是如果直接使用Core Data来进行数据存储又稍微有点复杂,那么我们就可以使用MagicalRecord来处理数据的持久化问题,类似于FMDB对sql语句的封装来简化我们的使用过程,MagicalRecord则是基于Core Data的封装使得你可以对非常容易的对它进行添加、查找、删除数据等其他一系列处理。

    主要内容

    • MagicalRecord的配置
    • 初始化数据库
    • 举例使用( 增删改查语法使用)
    MagicalRecord的配置
    • MagicalRecord库 可以pod也可以手动拖入,这个完全看个人习惯了。
    • 加入项目添加CoreData FrameWork
      点击工程根节点,然后依次Targets > Build Phases > Link Binary With Libraries > + > CoreData.framework > Add
    • 生成相关的类

    这部分由于比较容易查到,导入库,导入头文件,或者愿意加入到pch文件等,完全看个人的习惯了,所以不做详细的解释了就(ps:本来准备了几张的截图来对比,说明创建方法和创建之后 的对比图,想了想会导致篇幅太长了图片太多 于是没放上,哈哈)。

    初始化数据库
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        [MagicalRecord setupCoreDataStackWithStoreNamed:@“test.sqlite"];
        //同时初始化数据
    
    }
    
    

    程序停止时清除

    - (void)applicationWillTerminate:(UIApplication *)application {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
        [MagicalRecord cleanUp];
    }
    
    
    举例使用

    这里举例使用MagicalRecord来实现对一个存储有省市县三级信息的plist文件的存储和查找。


    一张严肃的图.png

    由上图可以知道我们的类的模样,包含的几个字段的名称

    类文件相关
    @property (nonatomic, retain) NSNumber * region_id;
    @property (nonatomic, retain) NSNumber * parent_id;
    @property (nonatomic, retain) NSString * region_name;
    @property (nonatomic, retain) NSNumber * region_type;
    @property (nonatomic, retain) NSNumber * agency_id;
    

    我们已经准备好了相关的类,也做好了数据的初始化和基本配置,为了以后的使用我们下面封装一个单例,其中包含数据的存储以及以后查找的方法,来方便我们的使用。
    创建我们需要的单例,同时导入我们之前的类的头文件

    +(instancetype)shared_manager{
        static Areas* areas;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            areas=[[Areas alloc] init];
            
        });
        return areas;
    }
    

    之后进一步的数据处理,包括类中查找信息,根据plist文件的路径读取数据,并根据对应的字段存入数据库中。

    1). 初始化数据并存入数据库
        NSArray* arr=[Area MR_findByAttribute:@"parent_id" withValue:@3];
        //首先查询一下是否存在  返回的通常是一个数组  如果不存在  进行下一步
        if (arr.count<1) {
    //在这里放入本地的文件数据的读取
    //根据本地的一些信息 数据创建数组  把数组内的数据 存储到相应的字段信息中
                    Area* area=[Area MR_createEntity] ;//新增一个实体
                    area.region_id=[[array objectAtIndex:i] objectForKey:@"region_id"];
                    area.parent_id=[[array objectAtIndex:i] objectForKey:@"parent_id"];
                    area.region_name=[[array objectAtIndex:i]objectForKey:@"region_name"];
                    area.region_type=[[array objectAtIndex:i]objectForKey:@"region_type"];
                    area.agency_id=[[array objectAtIndex:i] objectForKey:@"agency_id"];
                    [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreWithCompletion:nil];
    
                }
    

    我们在自己封装的类中做了数据的处理,为了方便我们进一步的使用,要封装一些方法,比如这里可以想到我们以后要根据以上几个字段进行数据库的查找并读取信息,因此我们要封装并实现它的查找方法。
    这里放几个方法做一个简单的说明:

    //查询所有的实体
    -(NSArray *)findRootAreas{
        
        NSArray*arr=[self findAreasByParentID:@1];
        return arr;
    }
    //查询出所有的Area实体 parent_id 为 parent_id 的实体
    -(NSArray *)findAreasByParentID:(NSNumber *)parent_id{
        NSArray* arr=[Area MR_findByAttribute:@"parent_id" withValue:parent_id];
        return arr;
    }
    //查询出所有的Area实体并按照 parent_id 升序(ascending)排列
    -(NSArray *)findAreasAscendingByParentID:(NSNumber *)parent_id{
        NSArray* arr=[Area MR_findAllSortedBy:@"parent_id" ascending:YES];;
        return arr;
    }
    

    通过上述的数据处理以及方法的实现我们可以发现MagicalRecord的一些语法的使用。
    实体的创建方法

          Area* area=[Area MR_createEntity] ;//新增一个实体
    

    信息的存储

       [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreWithCompletion:nil];
    

    查询实体信息

    [self findAreasByParentID:@1];
    

    查询出所有的Area 实体

    [Area MR_findAll];
    

    以条件查找
    //查询出所有的Area实体 parent_id 为 parent_id 的实体

    [Area MR_findByAttribute:@"parent_id" withValue:parent_id];
    

    其他语法
    删除一个实体

    [Area MR_deleteEntity];
    

    删除特定上下文中的实体

    [Area MR_deleteInContext:otherContext];
    

    删除所有实体

    [Area MR_truncateAll];
    

    查询实体个数

    NSNumber *count = [Area MR_numberOfEntities];
    

    封装完毕之后我们要进行调用我们封装的单例来实现数据的查找和其他操作,取出我们需要的值之后去做进一步的处理。

       NSArray *provincerootArray = [[Areas shared_manager] findRootAreas];
        for (Area *area in provincerootArray) {
            NSArray *tempArray = [[Areas shared_manager] findAreasByParentID:area.region_id];//通过省 取出对应的城市
           ....... 我是省略的内容.........
        //等等其他想要进行的操作
    }
    

    以上就是我们的这个栗子,重在说明他的使用(主动承认没有说 他的底层原理,哈哈),以及我们怎么根据自己的需求去封装自己的用法。

    结尾

    这么快就到了结尾的时候了,嘿嘿,要结尾了哦。

    另一张严肃的图
    MagicalRecord是一个很强大的库,可以进行许多操作,我们可以根据我们的实际需求做不同的应用,这一篇只是举个栗子来说明一下他的用法。
    下面放一下其他关于MagicalRecord原理,其他详细用法的网址以及MagicalRecord的git地址。
    MagicalRecord库git地址
    深入浅出MagicalRecord
    一篇相当于MagicalRecord的中文文档
    源码分析系列/MagicalRecord%20全面解析

    相关文章

      网友评论

        本文标题:MagicalRecord(基于Core Data的数据持久化)

        本文链接:https://www.haomeiwen.com/subject/umxknttx.html