CoreData存储NSDictionary、NSArray
CoreData是苹果推出的一个数据存储框架。CoreData提供了一种对象关系映射(ORM)的存储关系,CoreData可以将OC对象存储到数据库中,也可以将数据库中的数据转化为OC对象,这个过程不需要手动编写任何SQL语句,这是系统完成的,不像SQLite和FMDB。
CoreData里的类看着确实很头疼,常常记不住,不过还是贴出来加深下印象,有以下这四个:
NSManagedObjectContext ->托管对象上下文,进行数据操作时基本上和这个类有关。
NSManagedObjectModel ->托管对象模型,一个托管对象模型关联一个模型文件(.xcdatamodeld),存储数据库的数据结构。
NSPersistentStoreCoordinator ->持久化存储协调器,负责协调存储区和上下文之间的关系。
NSManagedObject ->托管对象,所有CoreData中的托管对象都必须继承自当前类,根据实体创建托管对象类文件。
我们知道在.xcdatamodeld里面可以add实体,就是表,然后往表里面添加属性,简单的字符串类型、基本数据类型Entity里都可以直接存储,但是复杂点的数组类型、字典类型等就不能直接存储,我们需要做些事情同样可以存储。
首先对Entity(MyFavTaskEntity)添加属性如locationDict,需要设置Attribute Type为Transformable,如下图所示1、2,设置Value Transformer为LocationDict,当然这个名字可以随便起,它是一个类名,继承NSValueTransformer,如下图3。
然后导出该实体,实体都是继承NSManagedObject,这正好得到证明,导出得到4个文件:
MyFavTaskEntity+CoreDataClass.h
// // MyFavTaskEntity+CoreDataClass.h // InteractiveMarketingGameEx // // Created by shenkun on 2016/11/15. // Copyright © 2016年 shenkun. All rights reserved. // This file was automatically generated and should not be edited. // #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @class NSObject; NS_ASSUME_NONNULL_BEGIN @interface MyFavTaskEntity : NSManagedObject @end NS_ASSUME_NONNULL_END #import "MyFavTaskEntity+CoreDataProperties.h"MyFavTaskEntity+CoreDataClass.m
// // MyFavTaskEntity+CoreDataClass.m // InteractiveMarketingGameEx // // Created by shenkun on 2016/11/15. // Copyright © 2016年 shenkun. All rights reserved. // This file was automatically generated and should not be edited. // #import "MyFavTaskEntity+CoreDataClass.h" @implementation MyFavTaskEntity @endMyFavTaskEntity+CoreDataProperties.h
// // MyFavTaskEntity+CoreDataProperties.h // InteractiveMarketingGameEx // // Created by shenkun on 2016/11/18. // Copyright © 2016年 shenkun. All rights reserved. // #import "MyFavTaskEntity+CoreDataClass.h" NS_ASSUME_NONNULL_BEGIN @interface MyFavTaskEntity (CoreDataProperties) + (NSFetchRequest<MyFavTaskEntity *> *)fetchRequest; @property (nullable, nonatomic, copy) NSString *addressStr; @property (nullable, nonatomic, retain) NSObject *cardListArray; @property (nullable, nonatomic, copy) NSString *cityStr; @property (nullable, nonatomic, copy) NSString *distanceStr; @property (nullable, nonatomic, retain) NSObject *goldenEggArray; @property (nullable, nonatomic, copy) NSString *idStr; @property (nullable, nonatomic, copy) NSString *imgUrlStr; @property (nullable, nonatomic, retain) NSObject *locationDict; @property (nullable, nonatomic, copy) NSString *nameStr; @property (nullable, nonatomic, copy) NSString *playerCountStr; @property (nullable, nonatomic, copy) NSString *pointStr; @property (nullable, nonatomic, copy) NSString *typeStr; @property (nullable, nonatomic, copy) NSString *usernameStr; @property (nullable, nonatomic, copy) NSString *stateStr; @end NS_ASSUME_NONNULL_ENDMyFavTaskEntity+CoreDataProperties.m
// // MyFavTaskEntity+CoreDataProperties.m // InteractiveMarketingGameEx // // Created by shenkun on 2016/11/18. // Copyright © 2016年 shenkun. All rights reserved. // #import "MyFavTaskEntity+CoreDataProperties.h" @implementation MyFavTaskEntity (CoreDataProperties) + (NSFetchRequest<MyFavTaskEntity *> *)fetchRequest { return [[NSFetchRequest alloc] initWithEntityName:@"MyFavTaskEntity"]; } @dynamic addressStr; @dynamic cardListArray; @dynamic cityStr; @dynamic distanceStr; @dynamic goldenEggArray; @dynamic idStr; @dynamic imgUrlStr; @dynamic locationDict; @dynamic nameStr; @dynamic playerCountStr; @dynamic pointStr; @dynamic typeStr; @dynamic usernameStr; @dynamic stateStr; @end这四个文件都是系统可以生成的,不是那么注重,注意看字典和数组类型生成的是NSObject了。主要的是刚才命名的LocationDict,我们要生产一个类继承NSValueTransformer,对字典封装转换才能存储。
LocationDict.h:
// // LocationDict.h // InteractiveMarketingGameEx // // Created by shenkun on 16/11/3. // Copyright © 2016年 shenkun. All rights reserved. // #import <Foundation/Foundation.h> //继承NSValueTransformer @interface LocationDict : NSValueTransformer @endLocationDict.m:
// // LocationDict.m // InteractiveMarketingGameEx // // Created by shenkun on 16/11/3. // Copyright © 2016年 shenkun. All rights reserved. // #import "LocationDict.h" @implementation LocationDict + (Class)transformedValueClass { //NSDictionary return [NSDictionary class]; } + (BOOL)allowsReverseTransformation { //标志 return YES; } - (id)transformedValue:(id)value { //转换成NSData保存到数据库 return [NSKeyedArchiver archivedDataWithRootObject:value]; } - (id)reverseTransformedValue:(id)value { //转换NSData成当前类型 return [NSKeyedUnarchiver unarchiveObjectWithData:value]; } @end
CoreData Mark文章
- 上一篇: iOS代码重构(二)CoreData多线程(支持线程安全)
- 下一篇: CoreData 存储数组