Mantle makes
it easy to write a simple model layer for your Cocoa or Cocoa Touch application.  Mantle
can still be a convenient translation layer between the API and your managed model objects.

本文使用mantle作data model。并使用其对coredata的interface创建数据持久化的过程。

操作过程非常easy。就是数据的转换:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbmd3ZWlwZW5nMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">

1.Manle data model

Mantle中用于持久化的方法:

// A MTLModel object that supports being serialized to and from Core Data as an

// NSManagedObject.

  • @protocol MTLManagedObjectSerializing
  • @required

// The name of the Core Data entity that the receiver serializes to and

// deserializes from.

  • + (NSString *)managedObjectEntityName;

// Specifies how to map property keys to different keys on the receiver's

// +managedObjectEntity.

  • + (NSDictionary *)managedObjectKeysByPropertyKey;

.h 文件

  1. #import <Foundation/Foundation.h>
  2. @interface BannerWrapper : MTLModel <MTLJSONSerializing,MTLManagedObjectSerializing>
  3. @property (nonatomic, readonly) bool result;
  4. @property (copy, nonatomic, readonly) NSNumber *resultId;
  5. @property (copy, nonatomic, readonly) NSString *resultMsg;
  6. @property (copy, nonatomic) NSArray *bannerList;
  7. +(NSSortDescriptor *)sortDescriptor;
  8. @end
  9. @interface Banner : MTLModel <MTLJSONSerializing, MTLManagedObjectSerializing>
  10. @property (copy, nonatomic, readonly) NSNumber *bannerId;
  11. @property (copy, nonatomic, readonly) NSString *picUrl;
  12. @property (copy, nonatomic, readonly) NSString *toDetailUrl;
  13. @property (copy, nonatomic, readonly) NSNumber *width;
  14. @property (copy, nonatomic, readonly) NSNumber *height;
  15. @end

.m文件

  1. #import "Banner.h"
  2. @implementation BannerWrapper
  3. #pragma mark - JSON serialization
  4. + (NSDictionary *)JSONKeyPathsByPropertyKey {
  5. return @{
  6. @"result" : @"result",
  7. @"resultId" : @"resultId",
  8. @"resultMsg" : @"resultMSG",
  9. @"bannerList" : @"banner"
  10. };
  11. }
  12. + (NSValueTransformer *)bannerListJSONTransformer
  13. {
  14. return [NSValueTransformer mtl_JSONArrayTransformerWithModelClass:[Banner class]];
  15. }
  16. #pragma mark - Managed object serialization
  17. + (NSString *)managedObjectEntityName {
  18. return @"BannerWrapper";
  19. }
  20. + (NSDictionary *)managedObjectKeysByPropertyKey {
  21. return nil;
  22. }
  23. +(NSDictionary *)relationshipModelClassesByPropertyKey{
  24. return @{
  25. @"bannerList"  : [Banner class],
  26. };
  27. }
  28. //在从coredata中取数据时的数据排序方式
  29. +(NSSortDescriptor *)sortDescriptor{
  30. return [[NSSortDescriptor alloc] initWithKey:@"resultId" ascending:YES];
  31. }
  32. @end
  33. @implementation Banner
  34. #pragma mark - JSON serialization
  35. + (NSDictionary *)JSONKeyPathsByPropertyKey {
  36. return @{
  37. @"bannerId" : @"id",
  38. @"picUrl" : @"picUrl",
  39. @"toDetailUrl" : @"toDetailUrl",
  40. @"width":@"width",
  41. @"height":@"height"
  42. };
  43. }
  44. #pragma mark - Managed object serialization
  45. + (NSString *)managedObjectEntityName {
  46. return @"Banner";
  47. }
  48. + (NSDictionary *)managedObjectKeysByPropertyKey {
  49. return nil;
  50. }
  51. @end

2.coredata 持久化类

Coredata主要元素简要介绍

网上有非常多图,但,还是认为一本书上的这个图最好:

  • 1。 Managed Object Model

    Managed Object Model 是描写叙述应用程序的数据模型,这个模型包括实体(Entity)。特性(Property),读取请求(Fetch Request)等。(下文都使用英文术语。)



    2,Managed Object Context

    Managed Object Context 參与对数据对象进行各种操作的全过程,并监測数据对象的变化,以提供对 undo/redo 的支持及更新绑定到数据的 UI。

    3,Persistent Store Coordinator

    Persistent Store Coordinator 相当于数据文件管理器,处理底层的对数据文件的读取与写入。

    一般我们无需与它打交道。

    4,Managed Object

    Managed Object 数据对象,与 Managed Object Context 相关联。



  • 5,Controller

    图中绿色的 Array Controller, Object Controller, Tree Controller 这些控制器。一般都是通过 control+drag 将 Managed Object Context 绑定到它们。这样我们就能够在 nib 中可视化地操作数据。

.h文件

  1. #import <Foundation/Foundation.h>
  2. @interface Persistence : NSObject
  3. //数据模型对象
  4. @property(strong,nonatomic) NSManagedObjectModel *managedObjectModel;
  5. //上下文对象
  6. @property(strong,nonatomic) NSManagedObjectContext *managedObjectContext;
  7. //持久性存储区
  8. @property(strong,nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
  9. //确定sqlite文件存储路径
  10. -(NSURL *)storeURL;
  11. //初始化Core Data使用的数据库
  12. -(NSPersistentStoreCoordinator *)persistentStoreCoordinator;
  13. //managedObjectModel的初始化赋值函数
  14. -(NSManagedObjectModel *)managedObjectModel;
  15. //managedObjectContext的初始化赋值函数
  16. -(NSManagedObjectContext *)managedObjectContext;
  17. //保存MTLModel对象至coredata
  18. -(BOOL)saveMTLModel:(MTLModel<MTLManagedObjectSerializing> *)mtlModel
  19. error:(NSError * __autoreleasing *)error;
  20. //从coredata中提取出MTLModel
  21. -(MTLModel *)getMTLmodel:(MTLModel<MTLManagedObjectSerializing> *)mtlModel
  22. error:(NSError *__autoreleasing *)error;
  23. //+ (NSFetchRequest *)fetchRequest;
  24. @end

.m文件

  1. #import "Persistence.h"
  2. @implementation Persistence
  3. @synthesize managedObjectContext;
  4. @synthesize managedObjectModel;
  5. @synthesize persistentStoreCoordinator;
  6. //确定sqlite文件存储路径
  7. -(NSURL *)storeURL{
  8. //得到数据库的路径
  9. //    NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
  10. //    //CoreData是建立在SQLite之上的。数据库名称需与Xcdatamodel文件同名
  11. //    NSURL *storeUrl = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"CoreData.sqlite"]];
  12. NSArray *documnetDir=NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
  13. NSString *docDir=[documnetDir objectAtIndex:0];
  14. NSString *path=[docDir stringByAppendingPathComponent:@"CoreData.sqlite"];
  15. NSURL *storeURL=[NSURL fileURLWithPath:path];
  16. return storeURL;
  17. }
  18. //初始化Core Data使用的数据库
  19. -(NSManagedObjectModel *)managedObjectModel
  20. {
  21. if (managedObjectModel != nil) {
  22. return managedObjectModel;
  23. }
  24. return [NSManagedObjectModel mergedModelFromBundles:nil];
  25. }
  26. //managedObjectModel的初始化赋值函数
  27. -(NSPersistentStoreCoordinator *)persistentStoreCoordinator
  28. {
  29. if (persistentStoreCoordinator != nil) {
  30. return persistentStoreCoordinator;
  31. }
  32. NSError *error = nil;
  33. persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
  34. initWithManagedObjectModel:self.managedObjectModel];
  35. if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
  36. configuration:nil
  37. URL:[self storeURL]
  38. options:nil
  39. error:&error]) {
  40. NSLog(@"Error: %@,%@",error,[error userInfo]);
  41. [NSException raise:@"open failed" format:@"Reason:%@",[error localizedDescription]];
  42. }
  43. return persistentStoreCoordinator;
  44. }
  45. //managedObjectContext的初始化赋值函数
  46. -(NSManagedObjectContext *)managedObjectContext
  47. {
  48. if (managedObjectContext != nil) {
  49. return managedObjectContext;
  50. }
  51. NSPersistentStoreCoordinator *coordinator =self.persistentStoreCoordinator;
  52. if (coordinator != nil) {
  53. managedObjectContext = [[NSManagedObjectContext alloc]init];
  54. [managedObjectContext setPersistentStoreCoordinator:coordinator];
  55. }
  56. return managedObjectContext;
  57. }
  58. //保存MTLModel对象至coredata
  59. -(BOOL)saveMTLModel:(MTLModel<MTLManagedObjectSerializing> *)mtlModel
  60. error:(NSError *__autoreleasing *)error{
  61. //-----Need Add Remove the Entity First  START---------
  62. NSManagedObject *exsitManagedObject=[self getManagedObject:mtlModel
  63. error:error];
  64. if (exsitManagedObject!=nil) {
  65. [self.managedObjectContext deleteObject:exsitManagedObject];
  66. [self.managedObjectContext save:error];
  67. };
  68. //-----Need Add Remove the Entity First  END-----------
  69. NSManagedObject *managedObject = [MTLManagedObjectAdapter
  70. managedObjectFromModel:mtlModel
  71. insertingIntoContext:self.managedObjectContext
  72. error:error];
  73. if (managedObject==nil) {
  74. NSLog(@"[NSManagedObject] Error:%@",*error);
  75. return NO;
  76. }
  77. if (![self.managedObjectContext save:error]) {
  78. NSLog(@"[self.managedObjectContext] Error:%@",*error);
  79. return NO;
  80. };
  81. return YES;
  82. };
  83. //从coredata中提取出MTLModel
  84. -(MTLModel *)getMTLmodel:(MTLModel<MTLManagedObjectSerializing> *)mtlModel
  85. error:(NSError *__autoreleasing *)error{
  86. NSManagedObject *managedObject=[self getManagedObject:mtlModel error:error];
  87. MTLModel *mrlMotel=[[MTLModel alloc] init];
  88. mrlMotel = [MTLManagedObjectAdapter modelOfClass:[mtlModel class]
  89. fromManagedObject:managedObject error:error];
  90. if (error) {
  91. NSLog(@"[mrlMotel] Error:%@",*error);
  92. }
  93. return mrlMotel;
  94. };
  95. //从coredata中获取已存的ManagedObject
  96. -(NSManagedObject *)getManagedObject:(MTLModel<MTLManagedObjectSerializing> *)mtlModel
  97. error:(NSError *__autoreleasing *)error{
  98. NSString *entityName=[[mtlModel class] managedObjectEntityName];
  99. //获取entity中对象数量
  100. NSFetchRequest *requestCount=[NSFetchRequest fetchRequestWithEntityName:entityName];
  101. NSUInteger count=[self.managedObjectContext countForFetchRequest:requestCount
  102. error:error];
  103. NSLog(@"count result:%d",count);
  104. NSLog(@"sortDescriptor result:%@",[[mtlModel class] sortDescriptor]);
  105. //获取entity中第一个对象.这个对象必须存在且唯一。
  106. if (count==1) {
  107. NSFetchRequest *request=[[NSFetchRequest alloc] init];
  108. [request setEntity:[NSEntityDescription entityForName:entityName
  109. inManagedObjectContext:self.managedObjectContext]];
  110. NSSortDescriptor *sort=[[mtlModel class] sortDescriptor];
  111. NSArray *sortDes=[[NSArray alloc] initWithObjects:sort, nil nil];
  112. [request setSortDescriptors:sortDes];
  113. NSArray *getObject=[self.managedObjectContext
  114. executeFetchRequest:request
  115. error:error];
  116. return [getObject objectAtIndex:0];
  117. }
  118. return nil;
  119. }
  120. //从文件系统中删除sqlite文件
  121. -(bool)deleteAllEntities{
  122. bool status=NO;
  123. NSError *error;
  124. @try{
  125. [[NSFileManager defaultManager] removeItemAtPath:[self storeURL].path
  126. error:&error];
  127. status=YES;
  128. }
  129. @catch (NSException *exception) {
  130. status=NO;
  131. }
  132. @finally {
  133. return status;
  134. }
  135. }
  136. @end

3.后台运行程序

  1. - (void)loadBannerList:(void (^)(NSArray *bannerList, NSError *error))block {
  2. NSParameterAssert(block);
  3. [self POST:@"webresources/homePage"
  4. parameters:nil
  5. resultClass:BannerWrapper.class
  6. resultKeyPath:nil
  7. completion:^(AFHTTPRequestOperation *operation, id responseObject, NSError *error) {
  8. //-----------------------Persistence DEMO---------------------
  9. //If network error, get data from CoreData, else save data into CoreData
  10. if (!error) {
  11. NSError *err;
  12. Persistence *persistence=[[Persistence alloc] init];
  13. BOOL save=[persistence saveMTLModel:responseObject error:&err];
  14. if (save==NO) {
  15. NSLog(@"Save ERROR!");
  16. }
  17. }else{
  18. NSError *err;
  19. Persistence *persistence=[[Persistence alloc] init];
  20. BannerWrapper *resObject=[[BannerWrapper alloc] init];
  21. BannerWrapper *object=[[BannerWrapper alloc] init];
  22. object=[persistence getMTLmodel:resObject error:&err];
  23. responseObject=object;
  24. //这个地方异常的奇怪,从coredata中应该返回打Array类型变成了set类型,所以这里临时作了一个转换。
  25. if ([object.bannerList isKindOfClass:[NSSet class]]) {
  26. NSArray *objectArray = [(NSSet *)object.bannerList  allObjects];
  27. ((BannerWrapper *)responseObject).bannerList=objectArray;
  28. }
  29. }
  30. //-----------------------------------------------------------
  31. BannerWrapper *wrapper = responseObject;
  32. block(wrapper.bannerList, error);
  33. }];
  34. }

Core Data with Mantle的更多相关文章

  1. 在 Core Data 中存取 transformable 类型的数据

    本文转载至 http://imenjoe.com/2015/04/10/CoreData-transformable-20150410/ 在开发过程中有一个需要在 Core Data 中存取 NSDi ...

  2. iOS之Core Data及其线程安全

    一.简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对 ...

  3. Core Data的一些常见用法

    一.简介 Core Data是一个纯粹的面向对象框架,其本质就是一个ORM(对象关系映射:Object Relational Mapping),能以面向对象的方式操作SQLite数据库.在实际开发中绝 ...

  4. Core Data 使用映射模型

    Core Data 使用映射模型 如果新版本的模型存在较复杂的更改,可以创建一个映射模型,通过该模型指定源模型如何映射到目标模型. 创建映射模型,新建File,  Core Data 选择Mappin ...

  5. SELF, self in CORE DATA

    Predicate SELF Represents the object being evaluated. CORE DATA Retrieving Specific Objects If your ...

  6. Core Data浅谈初级入门

    Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数 ...

  7. Core Data

    •   Core Data   是 iOS SDK   里的一个很强大的框架,允许程序员 以面向对象 的方式储存和管理数据 .使用 Core Data 框架,程序员可以很轻松有效 地通过面向对象的接口 ...

  8. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

  9. 我为什么用 SQLite 和 FMDB 而不用 Core Data

    凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他Cocoa开发者所理解,当有新人加入你的组或者需要别人接手你的项目的时候,这点很重要.更重要的是,不值得花时间和 ...

随机推荐

  1. 一个汉字转拼音的php类

    代码来自网上,可用 <?php function Pinyin($_String, $_Code='gb2312') { $_DataKey = "a|ai|an|ang|ao|ba| ...

  2. Java的Integer和int有什么区别

    Java是面向对象的编程语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper cla ...

  3. 《Lua程序设计》第4章 语句 学习笔记

    Lua中的常规语句包括:赋值.控制结构和过程调用.Lua还支持一些不太常见的语句,如:多重赋值(multiple assignment) 和 局部变量声明.4.1 赋值Lua允许“多重赋值”,也就是一 ...

  4. (原创)使用mceusb设备,将lirc移植到android笔记

    首先说一下大环境和总体步骤: 下载lirc 0.8.7源码,使用ubuntu的setup.sh,配置为mceusb的驱动,同时Compile tools for X-Windows选项去掉,生成con ...

  5. (原)强类型dataset(类型化dataset)中动态修改查询条件(不确定参数查询)

    原创博客,转载请注明:http://www.cnblogs.com/albert1017/p/3361932.html 查询时有多个参数,参数个数由客户输入决定,不能确定有多少个参数,按一般的方法每种 ...

  6. 由于更换硬盘没有删除系统自启动读取挂载硬盘导致系统报错:fsck.ext4 unable to resolve 'UUID=a4a7a0f7-b54f-4774-9fb1'

    由于更换硬盘没有删除系统自启动读取挂载硬盘导致系统报错:fsck.ext4 unable to resolve 'UUID=a4a7a0f7-b54f-4774-9fb1' 此时进入系统已root模式 ...

  7. 【node.js】Error: CERT_UNTRUSTED

    背景 : 在linux centos7 上 进行npm 命令是报错: Error: CERT_UNTRUSTED 解决办法: 关掉HTTPS就好了 npm config set strict-ssl ...

  8. 二、K3 Cloud 开发插件《K3 Cloud 常用数据表整理》

    一.数据库查询常用表 --查询数据表select * from ( ),t1.FKERNELXML.query('//TableName')) as 'Item',t1.FKERNELXML,t2.F ...

  9. mFC 橡皮线

    一般都用GDI实现: void CXiangpijinView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message ...

  10. 其它终端设备连接gmail账户提示密码错误解决方法

    换新手机配置Google Account继续使用Gmail服务,输入用户名.密码进入状态同步一段时间后再次提示输入用户名.密码并显示账号信息不正确.网上有人提到"修改用户密码"再进 ...