-
当系统提供的类型不能达到我们的使用要求时,比如我想在CoreData中存储UIColor,该怎么办呢?
这时候就要用到CoreData中非常强大的一个存储类型了:Transformable下面将通过一个例子简单介绍下如何存储像UIColor这种数据1、创建实体模型2、根据模型生成数据模型,并且创建用于转换Color的类,继承自NSValueTransform3、在.m文件中有4个必须实现的方法复制代码1 //2 // ColorTransformer.m3 // CoreData自定义模型数据4 //5 // Created by Liu Feng on 14-3-1.6 // Copyright (c) 2014年 Liu Feng. All rights reserved.7 //89 #import "ColorTransformer.h"1011 @implementation ColorTransformer1213 /** 允许转换 */14 + (BOOL)allowsReverseTransformation15 {16 return YES;17 }1819 /** 转换成什么类 */20 + (Class)transformedValueClass21 {22 return [NSData class];23 }2425 /** 返回转换后的对象 */26 - (id)transformedValue:(id)value27 {28 // 将color转成NSData29 UIColor *color = (UIColor *)value;3031 CGFloat red, green, blue, alpha;32 [color getRed:&red green:&green blue:&blue alpha:&alpha];3334 CGFloat components[4] = {red, green, blue, alpha};3536 NSData *dataFromColor = [[NSData alloc] initWithBytes:components length:sizeof(components)];3738 return dataFromColor;39 }4041 /** 重新生成原对象 */42 - (id)reverseTransformedValue:(id)value43 {44 NSData *data = (NSData *)value;4546 CGFloat components[4] = {0.0f, 0.0f, 0.0f, 0.0f};4748 [data getBytes:components length:sizeof(components)];4950 UIColor *color = [UIColor colorWithRed:components[0] green:components[1] blue:components[2] alpha:components[3]];5152 return color;53 }复制代码4、完成了以上步骤,我们就可以顺序的将UIColor对象存到 数据库中,并且从中取出,下面是测试用代码创建数据库管理类4.0 实现.m文件,代码如下复制代码1 #import "CoreDataManager.h"2 #import "Flower.h"3 #import <CoreData/CoreData.h>45 @implementation CoreDataManager67 - (id)init8 {9 if (self = [super init]) {10 // 创建数据库11 [self openDB];12 }13 return self;14 }1516 - (void)openDB17 {18 // 1. 合并模型19 NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];2021 // 2. 永久存储22 NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];2324 NSURL *fileURL = [NSURL fileURLWithPath:@"/Users/liufeng/Desktop/CoreData自定义模型数据/abc.db"];2526 NSError *error = nil;27 [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:fileURL options:nil error:&error];2829 if (error) {30 NSLog(@"数据库创建失败");31 }else {32 NSLog(@"数据库创建成功");33 }3435 if (!_ctx) {36 _ctx = [[NSManagedObjectContext alloc] init];37 }3839 _ctx.persistentStoreCoordinator = store;40 }复制代码4.1 最后是ViewController.m文件中的测试代码复制代码1 #import "ViewController.h"2 #import "Flower.h"3 #import "CoreDataManager.h"45 @interface ViewController ()67 @end89 @implementation ViewController1011 - (void)viewDidLoad12 {13 [super viewDidLoad];1415 CoreDataManager *manager = [[CoreDataManager alloc] init];1617 Flower *flower = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Flower class]) inManagedObjectContext:manager.ctx];1819 flower.name = @"liufeng"; 20 flower.color = [UIColor grayColor]; // 如果出现警告,请将flower模型内的 color 类型 从id 改成 UIColor *2122 if ([manager.ctx save:nil]) {23 NSLog(@"保存成功");24 }2526 NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([Flower class])];2728 NSError *error = nil;29 NSArray *array = [manager.ctx executeFetchRequest:request error:&error];3031 for (Flower *flower in array) {32 NSLog(@"---%@-%@", flower.name, flower.color);33 }34 }转载自:http://www.2cto.com/kf/201403/282650.html
iOS开发之数据存取3-CoreData自定义数据类型Transformable
最新推荐文章于 2020-07-25 22:41:07 发布