当系统提供的类型不能达到我们的使用要求时,比如我想在CoreData中存储UIColor,该怎么办呢?
这时候就要用到CoreData中非常强大的一个存储类型了:Transformable
下面将通过一个例子简单介绍下如何存储像UIColor这种数据
1、创建实体模型
2、根据模型生成数据模型,并且创建用于转换Color的类,继承自NSValueTransform
3、在.m文件中有4个必须实现的方法
//
// ColorTransformer.m
// CoreData自定义模型数据
//
// Created by Liu Feng on 14-3-1.
// Copyright (c) 2014年 Liu Feng. All rights reserved.
// #import "ColorTransformer.h" @implementation ColorTransformer /** 允许转换 */
+ (BOOL)allowsReverseTransformation
{
return YES;
} /** 转换成什么类 */
+ (Class)transformedValueClass
{
return [NSData class];
} /** 返回转换后的对象 */
- (id)transformedValue:(id)value
{
// 将color转成NSData
UIColor *color = (UIColor *)value; CGFloat red, green, blue, alpha;
[color getRed:&red green:&green blue:&blue alpha:&alpha]; CGFloat components[] = {red, green, blue, alpha}; NSData *dataFromColor = [[NSData alloc] initWithBytes:components length:sizeof(components)]; return dataFromColor;
} /** 重新生成原对象 */
- (id)reverseTransformedValue:(id)value
{
NSData *data = (NSData *)value; CGFloat components[] = {0.0f, 0.0f, 0.0f, 0.0f}; [data getBytes:components length:sizeof(components)]; UIColor *color = [UIColor colorWithRed:components[] green:components[] blue:components[] alpha:components[]]; return color;
}
4、完成了以上步骤,我们就可以顺序的将UIColor对象存到数据库中,并且从中取出,下面是测试用代码
创建数据库管理类
4.0 实现.m文件,代码如下
#import "CoreDataManager.h"
#import "Flower.h"
#import <CoreData/CoreData.h> @implementation CoreDataManager - (id)init
{
if (self = [super init]) {
// 创建数据库
[self openDB];
}
return self;
} - (void)openDB
{
// 1. 合并模型
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil]; // 2. 永久存储
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; NSURL *fileURL = [NSURL fileURLWithPath:@"/Users/liufeng/Desktop/CoreData自定义模型数据/abc.db"]; NSError *error = nil;
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:fileURL options:nil error:&error]; if (error) {
NSLog(@"数据库创建失败");
}else {
NSLog(@"数据库创建成功");
} if (!_ctx) {
_ctx = [[NSManagedObjectContext alloc] init];
} _ctx.persistentStoreCoordinator = store;
}
4.1 最后是ViewController.m文件中的测试代码
#import "ViewController.h"
#import "Flower.h"
#import "CoreDataManager.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad
{
[super viewDidLoad]; CoreDataManager *manager = [[CoreDataManager alloc] init]; Flower *flower = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Flower class]) inManagedObjectContext:manager.ctx]; flower.name = @"liufeng"; flower.color = [UIColor grayColor]; // 如果出现警告,请将flower模型内的 color 类型 从id 改成 UIColor * if ([manager.ctx save:nil]) {
NSLog(@"保存成功");
} NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([Flower class])]; NSError *error = nil;
NSArray *array = [manager.ctx executeFetchRequest:request error:&error]; for (Flower *flower in array) {
NSLog(@"---%@-%@", flower.name, flower.color);
}
}
4.2 下面是输出结果:
经过以上步骤就实现了UIColor的存取。 转载请注明出处 @bbqe http://www.cnblogs.com/liufeng24/