zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    寒假了
    【MFC】浏览器中快速打开常用工具
    【转】MFC隐藏进程自身(任务管理器不可见,wSysCheck等工具可见)
    【原】DIY属于自己的鼠标侧键
    coco2dx 3.4final 使用scale9sprite
    linux挂载新硬盘
    关于c语言中的结构体使用偏移量求值问题
    Linux的网卡由eth0变成了eth1,如何修复
    oracle归档管理
    exsi上虚拟因硬盘不足无法启动
  • 原文地址:https://www.cnblogs.com/liufeng24/p/3516738.html
Copyright © 2011-2022 走看看