CoreData存储NSDictionary、NSArray

本文介绍了如何使用CoreData框架在iOS中存储复杂数据类型如NSDictionary和NSArray。CoreData提供ORM功能,避免手动编写SQL。通过在实体中设置属性类型为Transformable并指定Value Transformer,可以实现对NSDictionary和NSArray的存储。文章详细阐述了配置过程,并提到需要自定义继承自NSValueTransformer的类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        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

CoreData Mark文章


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值