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

iOS开发之数据存取3-CoreData自定义数据类型的更多相关文章

  1. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  2. 【转】iOS开发系列--数据存取

    原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...

  3. ios开发之数据存取1-SQLite

    iOS开发中常用的数据存取方式有: XML属性列表-PList NSKeyedArchiver 归档 Preference-偏好设置 SQLite3 Core Data-以面向对象的方式操作数据库SQ ...

  4. iOS开发之数据存取2-CoreData后台查询数据

    注意:本人所讲的后台查询必须在使用CoreData时选择存储类型为“SQLite”,因为二进制或者XML存储方式会在打开的时候直接读到内存中. 1.CoreData数据后台查询出现的情况 CoreDa ...

  5. iOS开发之数据存取

    http://www.cocoachina.com/ios/20141111/10190.html

  6. ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

    本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布 ...

  7. IOS开发中数据持久化的几种方法--NSUserDefaults

    IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...

  8. 李洪强iOS开发之数据存储

    李洪强iOS开发之数据存储 iOS应用数据存储的常用方式 1.lXML属性列表(plist)归档 2.lPreference(偏好设置) 3.lNSKeyedArchiver归档(NSCoding) ...

  9. iOS开发网络数据之AFNetworking使用

    iOS开发网络数据之AFNetworking使用 如何选择AFNetworking版本 首先得下载AFNetworking库文件,下载时得首先弄清楚,你将要开发的软件兼容的最低版本是多少.AFNetw ...

随机推荐

  1. 20150323--MVC

    MVC: Model view(视图层,模板) Control(控制层) 三层:数据访问,商业逻辑,用户界面(Webform,MVC). 服务端无状态:接受请求,返回页面,每次请求并返回界面,前后不是 ...

  2. UI1_UIView层操作

    // // ViewController.m // UI1_UIView层操作 // // Created by zhangxueming on 15/7/1. // Copyright (c) 20 ...

  3. JavaScript之Function函数深入总结

    整理了JavaScript中函数Function的各种,感觉函数就是一大对象啊,各种知识点都能牵扯进来,不单单是 Function 这个本身原生的引用类型的各种用法,还包含执行环境,作用域,闭包,上下 ...

  4. Codevs 3231 小吃

     时间限制: 1 s  空间限制: 16000 KB  题目等级 : 黄金 Gold 题目描述 Description 这里简直是吃货的天堂,小吃太多了.数不胜数. 假设岛上有N种小吃,每种体积Vi, ...

  5. .NET清除Session 的几个方法[clear/removeAll/remove/Abandon]

    1.clear() 清空所有session对象的值,但保留会话   2.removeAll() 调用clear()方法   3.remove("SessionName") 删除某个 ...

  6. [Guava源码分析]ImmutableCollection:不可变集合

    摘要: 我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3888557.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的 ...

  7. Linux实现的IEEE 802.q VLAN

    本文转载自: http://blog.chinaunix.net/uid-20786208-id-4291059.html Technorati 标签: Linux VLAN   ---------- ...

  8. 【转】理解依赖注入(IOC)和学习Unity

    IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection).作用:将各层的对象以松耦合的方式组织在一起,解耦,各 ...

  9. Android studio 读取properties文件

    System.out.println(Thread.currentThread().getContextClassLoader().getResource("").getPath( ...

  10. 安装WordPress详细教程指南

    最近准备自己建一个个人博客,以便分享一些自己工作生活中的一些观点及经验,建博客当然选wordpress,毕竟wordpress是为博客而生的嘛.下边记录一下自己安装WordPress的详细过程指南,亦 ...