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. ubuntu 14.04 LTS 右键菜单解压压缩包时出错

    先卸载rar sudo apt-get remove rar 再安装unrar sudo apt-get install unrar

  2. cmake编译android平台的libPoco

    1.下载源代码,解压到POCO-1.7.8-ALL 2.从$ANDROID_NDK\cmake下复制android.toolchain.cmake AndroidNdkGdb.cmake Androi ...

  3. ARC下带CF前缀的类型与OC类型转换

    在对钥匙串操作时这个函数 OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef * __nullable CF_RETURNS_R ...

  4. 移动端前端框架UI库

    移动端前端框架UI库(Frozen UI.WeUI.SUI Mobile) Frozen UI 自述:简单易用,轻量快捷,为移动端服务的前端框架. 主页:http://frozenui.github. ...

  5. 使用PowerShell替代WinDbg在高分辨率笔记本下调试、排错

    最近换新的开发笔记本,分辨率较高发现部分应用在High DPI下几乎没法用.比较纠结的就是WinDbg,频繁切换分辨率.显示文字大小影响工作节奏.幸好PowerShell在High DPI下效果不错. ...

  6. C语言qsort用法

    一.对int类型数组排序 int num[100]; Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *( ...

  7. 状态机FSM

    参考: 百度-有限状态机 博客园-有限状态机FSM详解及其实现 CSDN-状态机FSM代码框架 腾讯开源项目behaviac 占坑,待编辑...

  8. 23种设计模式之中介者模式(Mediator)

    中介者模式是一种对象的行为型模式,通过一个中介对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者对象的存在保证了对象结构上的稳 ...

  9. vue报错/ style-loader: Adds some css to the DOM by adding a <style> tag

    1.1.1.   vue-cli搭建的项目引入.styl/css文件报错 http://blog.csdn.net/z852064121/article/details/72660327 / styl ...

  10. POJ-1157 LITTLE SHOP OF FLOWERS(动态规划)

    LITTLE SHOP OF FLOWERS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19877 Accepted: 91 ...