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. 当本机通过代理服务器上网时,本机无法打开在本机上的虚拟机(oracle vm)linux系统上的网站,但是局域网里的其他机器却可以打开

    当本机通过代理服务器上网时,本机无法打开在本机上的虚拟机(oracle vm)linux系统上的网站,但是局域网里的其他机器却可以打开. 只有取消代理,本机才能访问其虚拟机linux系统上的网站

  2. LeetCode - 637. Average of Levels in Binary Tree

    Given a non-empty binary tree, return the average value of the nodes on each level in the form of an ...

  3. Internet Message Access Protocol --- IMAP协议

    https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol   Internet Message Access Protocol

  4. 正则表达式取querystring

    var s = decodeURIComponent((new RegExp('[?|&]userid=([^&;]+?)(&|#|;|$)').exec(location.h ...

  5. HDU 2199 Can you solve this equation(二分答案)

    Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  6. 去掉VS2010代码中文注释的红色下划线

    VS2010代码中文注释出现红色下划线,代码看上去很不美观,发现是由于安装Visual Assist X插件造成的. 解决办法:打开VAX的Options对话框,取消Advanced --> U ...

  7. 23种设计模式之抽象工厂(Abstract Factory)

    抽象工厂模式又称为Kit模式,属于对象创建型模式.抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.在抽象工厂模 ...

  8. 使用HtmlAgilityPack解析html

    HtmlAgilityPack是.net下使用xPath来解析html的类库,可以方便的做html的页面分析处理 项目地址: http://htmlagilitypack.codeplex.com/ ...

  9. 数据库操作相关(sql语句-命令行)

    创建数据库: create database books; 创建用户: mysql> grant select,insert,delete,uptate     -> on books.* ...

  10. [转]Android Activity的加载模式和onActivityResult方法之间的冲突

    前言 今天在调试程序时,发现在某一Activity上点击返回键会调用该Activity的onActivityResult()方法.我一开始用log,后来用断点跟踪调试半天,还是百思不得其解.因为之前其 ...