文档章节

MagicalRecord配合Mantle

Megan_zhou
 Megan_zhou
发布于 2014/12/19 14:03
字数 1045
阅读 112
收藏 0

在开始之前,我们先创建一个名为MemberManaged的实体image

MemberManaged.h

@interface MemberManaged : NSManagedObject 
@property ( nonatomic, retain) NSString * memberID;
@property ( nonatomic, retain) NSString * mobilePhone;
@property ( nonatomic, retain) NSDate * createDate;
@property ( nonatomic, retain) NSNumber * goldNumber;
@property ( nonatomic, retain) NSNumber * age;
@property ( nonatomic, retain) NSNumber * isVip;
@property ( nonatomic, retain) NSString * url;

快速入门后续的例子都是以此实体进行数据库的操作

配置

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[MagicalRecord setupAutoMigratingCoreDataStack];
// ... 
return YES;
}
- (void)applicationWillTerminate:(UIApplication *)application
{
[MagicalRecord cleanUp];
}

查找数据

//返回MemberManaged表中的第一条数据 
MemberManaged *memberManaged = [MemberManaged MR_findFirst];
//返回MemberManaged表中的所有数据 
NSArray *array = [[MemberManaged MR_findAll];
//键值条件查找,返回符合条件的所有数据 
NSArray *array = [MemberManaged MR_findByAttribute:@ "memberID" withValue:@ "1"];
//按指定字段排序 
NSArray *array = [MemberManaged MR_findAllSortedBy: @"age" ascending: YES];
//自定义NSPredicate查找,返回符合条件的所有数据 
NSPredicate *pre = [NSPredicate predicateWithFormat:@ "age > 18"];
MemberManaged *memberManaged = [MemberManaged MR_findAllWithPredicate:pre];

插入数据

对于NSPredicate不熟悉的同学可以看我之前写的介绍NSPredicate的博文,关于其他的查找方法我就不一一介绍了。

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    MemberManaged *memberManaged = [MemberManaged MR_createInContext:localContext];
    memberManaged.memberID = @"1";
    memberManaged.mobilePhone = @"xxxxxxxx";
    memberManaged.createDate = [NSDate date];
    memberManaged.goldNumber = @2;
    memberManaged.age = @18;
    memberManaged.url = @"http://bawn.github.io/";
    memberManaged.isVip = @YES;
    
} completion:^(BOOL success, NSError *error) {
    // ...
}];

删除数据

//删除单条数据
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
MemberManaged *member = [MemberManaged MR_findFirstInContext:localContext];
[member MR_deleteEntity];
} completion:^(BOOL success, NSError *error) {
// ... 
}];
//删除表
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
[MemberManaged MR_truncateAllInContext:localContext];
} completion:^(BOOL success, NSError *error) {
// ... 
}];

更新数据

MemberManaged *member = [MemberManaged MR_findFirst];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    MemberManaged *localMember = [member MR_inContext:localContext];
    localMember.age = @22;
} completion:^(BOOL success, NSError *error) {
    // ...
}];

为什么不用[NSManagedObjectContext save:]方法,请看博客

配合Mantle

基本转换

上一篇博文中提到Mantle的<MTLManagedObjectSerializing>协议,此协议有两个必须实现的方法:

//返回此类对应的实体类名
+ (NSString *)managedObjectEntityName;
//返回此类和实体属性的映射关系
+ (NSDictionary *)managedObjectKeysByPropertyKey;

另外由于Member类和MemberManaged类的url字段的类型不一致,需要实现另一个协议方法,实现NSUrl—>NSString(age和isVip字段不需要转换,不要问我为什么)

//属性值转换
+ (NSValueTransformer *)entityAttributeTransformerForKey:(NSString *)key;

先看具体实现

Member.h

@interface Member : MTLModel<MTLJSONSerializing, MTLManagedObjectSerializing>
@property (nonatomic, retain) NSString * memberID;
@property (nonatomic, retain) NSString * mobilePhone;
@property (nonatomic, retain) NSDate * createDate;
@property (nonatomic, retain) NSNumber *goldNumber;
@property (nonatomic, assign) NSUInteger age;
@property (nonatomic, assign) BOOL isVip;
@property (nonatomic, retain) NSURL *url;

Member.m

//表示Member类对应的实体类是MemberManaged
+ (NSString *)managedObjectEntityName{
    return @"MemberManaged";
}
//表示Member类向MemberManaged类转换的字段映射,因为Member类的字段名是相同,所以这里返回nil
+ (NSDictionary *)managedObjectKeysByPropertyKey{
    return nil;
}
//表示Member的url向MemberManaged的url字段值转换
+ (NSValueTransformer *)entityAttributeTransformerForKey:(NSString *)key{
    if ([key isEqualToString:@"url"]) {
        return [MTLValueTransformer reversibleTransformerWithBlock:^id(NSURL *url) {
            return url.absoluteString;
        }];
    }
    else{
        return nil;
    }
}

具体运用:

NSDictionary *dic = @{@"id" : @"1",
                      @"phone" : @"xxxxxxxx",
                      @"date" : @"2014-09-09",
                      @"goldNumber" : @2,
                      @"age" : @"28",
                      @"url" : @"http://bawn.github.io/",
                      @"isVip" : NSNull.null
                      };
Member *member = [MTLJSONAdapter modelOfClass:[Member class] fromJSONDictionary:dic error:nil];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    [MTLManagedObjectAdapter managedObjectFromModel:member insertingIntoContext:localContext error:nil];
} completion:^(BOOL success, NSError *error) {
    NSLog(@"%@", [(MemberManaged *)[MemberManaged MR_findFirst] isVip]);
}];
  1. Member *member = [MTLJSONAdapter modelOfClass:[Member class] fromJSONDictionary:dic error:nil];完成从NSDictionary—>Member转换,并返回Member实例
  2. [MTLManagedObjectAdapter managedObjectFromModel:member insertingIntoContext:localContext error:nil];完成Member—>MemberManaged转换,返回MemberManaged实例,但是我们并不需要。
  3. 配合MagicalRecord储存方法+ (void) saveWithBlock:(void(^)(NSManagedObjectContext *localContext))block;

注意:对于MemberManaged类,我们并不需要对它做任何的处理。

唯一性检查

同样是实现<MTLManagedObjectSerializing>中的一个方法:

+ (NSSet *)propertyKeysForManagedObjectUniquing{
    return [NSSet setWithObject:@"memberID"];
}

执行一下代码表示当插入新数据的时候,对比需要插入的这条数据的memberID字段的值是否和数据库中的有相同。如果有相同就覆盖更新这条数据,如果没有就新增。这样带来的方便之处显而易见。

for (int n = 0; n < 2; n++) {
      NSDictionary *dic = @{@"id" : @"1",
                            @"phone" : @"xxxxxxxx",
                            @"date" : @"2014-09-09",
                            @"goldNumber" : @2,
                            @"age" : @"18",
                            @"url" : @"http://bawn.github.io/",
                            @"isVip" : NSNull.null
                            };
      
      Member *member = [MTLJSONAdapter modelOfClass:[Member class] fromJSONDictionary:dic error:nil];
      [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
          [MTLManagedObjectAdapter managedObjectFromModel:member insertingIntoContext:localContext error:nil];
      } completion:^(BOOL success, NSError *error) {
          NSLog(@"%d", [(MemberManaged *)[MemberManaged MR_findFirst] isVip].boolValue);
      }];
  }

数据库中只有一条数据,因为插入的数据的memberID都是2。

总结

MagicalRecord配合Mantle使用至少让代码看起来简洁了不少,再也不用为Core Data复杂的API而烦恼,也不用再写if/else来做字段的转换。

Demo地址:MagicalRecord-Mantle

本文转载自:http://bawn.github.io/2014/12/15/MagicalRecord/#配合Mantle

Megan_zhou
粉丝 72
博文 116
码字总数 30181
作品 0
浦东
程序员
私信 提问
请问IOS MagicalRecord 需要支持iOS 5.x 及以上,该用哪个版本?

请问IOS MagicalRecord 需要支持iOS 5.x 及以上,该用哪个版本?

cyz108D
2014/05/23
51
0
10大iOS开发者最喜爱的类库

1)SSToolkit Sam Soffes简直就是一个Objective-C天才,SSToolkit就是个例子。作者将他在App中实现的各种各样的UI效果做成个代码库,方便其他人使用 2)GPUImage GPUImage一个功能十分强大又...

慎道
2012/11/08
437
1
iOS 开发中 使用第三方库MagicalRecord对数据库进行管理时,怎样删除数据库中两条完全一样的数据的其中一条,它那个自动生成的id怎样使用

@Redding 你好,想跟你请教个问题:iOS 开发中 使用第三方库MagicalRecord对数据库进行管理时,怎样删除数据库中两条完全一样的数据的其中一条,它那个自动生成的id怎样使用...

不耻下问
2015/11/29
315
0
27 个 iOS 开源库,让你的开发坐上火箭吧

本文翻译自Medium,原作者是Paweł Białecki,查看原文 你不会想错过他们,真的。 我爱开源。 并且我喜欢开发者们,把他们宝贵的私人时间用来创造神奇的东西,然后他们会和其他人分享并且不...

oschina
2016/07/20
3.8K
6
27 款 iOS 开源库,让你的开发溜到飞起

我爱开源。 我也爱开发者们,他们花费大量宝贵的时间创造出如此惊人的东西,然后与其他人分享,而不要求任何回报。开源作者和贡献者们,你们令人敬佩。感谢你们所有的工作。 我在处理自己的 ...

oschina
2016/11/29
5.9K
6

没有更多内容

加载失败,请刷新页面

加载更多

jquery底层函数-jQuery.ajaxSetup()

jQuery.ajaxSetup( options )返回: 描述: 为以后要用到的Ajax请求设置默认的值 添加的版本: 1.1jQuery.ajaxSetup( options ) options 类型: PlainObject 一个用来配置Ajax请求的"{键:值}"对,......

前端老手
31分钟前
7
0
Qt编写自定义控件56-波浪曲线

一、前言 波浪曲线控件,其实是之前一个水波进度条控件的一个核心,其实就是利用正弦曲线来生成对应的坐标进行绘制,把这个功能单独提取出来,是为了更详细的研究各种正弦余弦等拓展效果,当...

飞扬青云
38分钟前
6
0
深入理解计算机系统cp1:存储单位与编码

摘要: 理解计算机是如何存储数据的。 原文:深入理解计算机系统cp1:存储单位与编码 作者:Chor Fundebug经授权转载,版权归原作者所有。 1. 存储单位 位:即 bit,表示二进制位,要么是 0 ...

Fundebug
40分钟前
6
0
Python查询比特币实时价格

在本文中我们将学习如何使用使用coinmarketcap提供的比特币行情API,编写Python程序来获取像比特币、莱特币或以太币之类的区块链数字货币的实时行情/实时价格。 1、比特币行情API调用代码 我...

汇智网教程
今天
8
0
爬虫平台Crawlab核心原理--自动提取字段算法

⚠注意: 可配置爬虫现在仅在Python版本(v0.2.1-v0.2.4)可用,在最新版本Golang版本(v0.3.0)还暂时不可用,后续会加上,请关注近期更新 背景 实际的大型爬虫开发项目中,爬虫工程师会被要...

tikazyq
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部