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. nodeJs学习过程之认识nodejs

    nodeJs只是听说过,没见过,没玩过.从新手开始,我想慢慢掌握它. 一.首先,我想知道nodeJs是什么? 摘自百度百科: Node.js是一套用来编写高性能网络服务器的JavaScript工具包, ...

  2. cygwin设置NDK环境变量ANDROID_NDK_ROOT

    cygwin安装目录下的“home/当前用户名”的.bash_profile下以UltraEdit(Unix方式)或者eclipse打开,最后添加一句: ANDROID_NDK_ROOT=/cygdr ...

  3. 【正则表达式1】C++11正则表达式

    https://www.cnblogs.com/pukaifei/p/5546968.html [正则表达式1]C++11正则表达式   头文件 #include <regex> rege ...

  4. ThinkPad L421 如何进入BIOS?(已解决)

    开机屏幕出现ThinkPad标志时,快速按下 F1键 即可进入BIOS

  5. 法律&道德

    西弗森是美国加州一名95岁的老妇人,2010年12月份的一天,她在家清理房间,当她翻开一叠纸的时候,一本书从里面掉了下来,她弯腰拾起来,发现是一本名叫<水上飞机独自飞>的书,再一看书页里的 ...

  6. Oracle相关内容整理

    一.常用sql 1.查看版本 SELECT * FROM V$VERSION; SELECT version FROM V$INSTANCE 2.数据库发生死锁时,跟踪文件的位置 关于跟踪文件,大义是 ...

  7. fs-extra 文件管理

    一.fs-extra 文件管理 $npm install fs-extra --save 1.创建一个目录 fs.mkdir(path, [mode], [callback(err)]) path 将 ...

  8. VB学习之路基础(一)

    1.VB不区分大小定,VB编辑器会自动更正. 2.每一行代码语句,没有语句结束符. 3.续行符:一个"空格"加上一个"下划线".不能在参数中间加续行符. 5.合 ...

  9. iOS - 开源框架、项目和学习资料汇总(其他篇)

    数据库 1. FMDB – sqlite的工具, 多线程FMDatabaseQueue实例,FMDB数据库的使用演示和封装工具类.GXDatabaseUtils – 在FMDB基础上的工具.2. re ...

  10. yii---where or该如何使用

    今天调试YII项目的时候,遇到一个奇葩的事儿,在调试 where or 查询的时候:调试语句是这样: $str = static::find()->where(['or','username' ...