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