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

开篇

这篇文章主要介绍的是基于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全面解析

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

推荐阅读更多精彩内容