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. thinkjs中修改默认主键

    报错信息: { Error: ER_BAD_FIELD_ERROR: Unknown column 'a_role.id' in 'field list' 还原场景: a_role这张表没有自增的id ...

  2. tomcat端口被占用的两个解决方法

    tomcat 的 8080 端口经常会被占用,解决办法两个: 1.关闭占用8080端口的进程:8080端口被占用的话执行startup.bat会报错,可在cmd下执行netstat -ano命令查看8 ...

  3. 关于GDI+的一些使用基础设置

    一.新建一个MFC的单文档工程,例如工程名字叫GDIPLUSTEST1. 二.在工程的stdafx.h头文件中添加入 #include "gdiplus.h" using name ...

  4. Swift - 可选类型详解

    可选类型详解 直接上代码解释 // 类中所有的属性在对象初始化时,必须有初始化值 class Person : NSObject { var name : String? var view : UIV ...

  5. 解决neo4j @Transactional 与Spring data jpa @Transactional 冲突问题,@CreatedBy,@CreatedDate,@LastModifiedBy,@LastModifiedDate,以及解决@Version失效问题

    之前mybatis特别流行,所以前几个项目都是用@SelectProvider,@InsertProvider,@UpdateProvider,@DeleteProvider 加反射泛型封装了一些通用 ...

  6. 【docker】使用docker 安装 宝塔面板

    拉取centos基础镜像,用容器启动该基础镜像,直接在这个容器中部署 1 拉取纯净系统镜像 docker pull centos: 2 启动镜像,映射主机与容器内8888端口 docker run - ...

  7. 【docker】 centos7 下 使用docker 安装 LNMP

    一.安装 mysql 1 获取 mysql 镜像 docker pull mysql:5.7 2 创建mysql的镜像,并运行 docker run -d -p : -e MYSQL_ROOT_PAS ...

  8. 支持向量机SVM进阶

    本文适合于对SVM基本概念有一点了解的童鞋. SVM基本概念: 最大边缘平面--基本原理:结构风险最小化 分类器的泛化误差 支持向量 问题描述: 请对一下数据,利用svm对其进行分类.       最 ...

  9. phpstorm10激活加汉化

    所用到的文件:链接:http://pan.baidu.com/s/1boNqCcJ 密码:61nz 分享文件夹中,有一个“PHP Storm激活和汉化方法.zip”文件其中有一个“resources_ ...

  10. 2-5 vue基础语法

    一.vue基础语法 语法: {{msg}} html赋值: v-html="" 绑定属性: v-bind:id="" 使用表达式: {{ok? "ye ...