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
@end
MyFavTaskEntity+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_END
MyFavTaskEntity+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
@end
LocationDict.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