iOS开发之数据存取3-CoreData自定义数据类型

当系统提供的类型不能达到我们的使用要求时,比如我想在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/

 

posted @ 2014-03-01 23:10  2020_xx  阅读(2068)  评论(0编辑  收藏  举报