iOS Core Data: 存储自定义对象 Save Custom NSObject

思路:将NSObject转化为NSData,然后将NSData存入到Core Data中

Core Data实现

添加数据:

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];
    NSManagedObject *newContact;
    newContact = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:context];

    Person *person = [[Person alloc] init];
    person.name = @"Xiaoming";
    person.number = @"1008610086";

    Birthday *birthday = [[Birthday alloc] init];
    birthday.year = @"2000";
    birthday.month = @"January";
    birthday.day = @"1st";
    person.birthday = birthday;

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person];
    [newContact setValue:data forKey:@"person"];

    NSError *error;
    [context save:&error];

获取数据:

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];

    NSManagedObjectContext *context = [appDelegate managedObjectContext];
    NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:context];
    [request setEntity:entityDesc];

    NSManagedObject *matches = nil;

    NSError *error;
    NSArray *objects = [context executeFetchRequest:request
                                              error:&error];

    if ([objects count] == 0)
    {
        NSLog(@"No matches");
    }
    else
    {
        for (int i = 0; i < [objects count]; i++)
        {
            matches = objects[i];
            NSData *data = [matches valueForKey:@"person"];
            Person *person = [NSKeyedUnarchiver unarchiveObjectWithData:data];
            NSLog(@"My name is %@. I was born on %@ %@, %@. My phone number is %@", person.name, person.birthday.month, person.birthday.day, person.birthday.year, person.number);
        }
    }

Model文件中设置person的类型设为Binary Data:

Person和Birthday这两个自定的NSObject,都需要使用NSCoding,实现initWithCoder和encodeWithCoder两个方法

Person

//
//  Person.h
//  CoreDataTest
//

#import <Foundation/Foundation.h>
#import "Birthday.h"

@interface Person : NSObject<NSCoding>

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *number;
@property (strong, nonatomic) Birthday *birthday;

- (id)init;

@end
//
//  Person.m
//  CoreDataTest
//

#import "Person.h"

@implementation Person

- (id)init{
    self.name  = nil;
    self.number  = nil;

    return self;
}

- (id)initWithCoder:(NSCoder *)decoder{
    if (self = [super init]){
        self.name  = [decoder decodeObjectForKey: @"name"];
        self.number  = [decoder decodeObjectForKey: @"number"];
        self.birthday = [decoder decodeObjectForKey: @"birthday"];
    }

    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder{
    [encoder encodeObject:self.name forKey:@"name"];
    [encoder encodeObject:self.number forKey:@"number"];
    [encoder encodeObject:self.birthday forKey:@"birthday"];
}

@end

Birthday

//
//  Birthday.h
//  CoreDataTest
//

#import <Foundation/Foundation.h>

@interface Birthday : NSObject<NSCoding>

@property (strong, nonatomic) NSString *year;
@property (strong, nonatomic) NSString *month;
@property (strong, nonatomic) NSString *day;

- (id)init;

@end
//
//  Birthday.m
//  CoreDataTest
//

#import "Birthday.h"

@implementation Birthday

- (id)init{
    self.year  = nil;
    self.month  = nil;
    self.day  = nil;

    return self;
}

- (id)initWithCoder:(NSCoder *)decoder{
    if (self = [super init]){
        self.year  = [decoder decodeObjectForKey: @"year"];
        self.month  = [decoder decodeObjectForKey: @"month"];
        self.day = [decoder decodeObjectForKey: @"day"];
    }

    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder{
    [encoder encodeObject:self.year forKey:@"year"];
    [encoder encodeObject:self.month forKey:@"month"];
    [encoder encodeObject:self.day forKey:@"day"];
}

@end

参考链接:

http://sam.roon.io/archiving-objective-c-objects-with-nscoding

https://coderwall.com/p/mx_wmq/how-to-save-a-nsarray-nsmutablearray-in-core-data

http://pinkstone.co.uk/how-to-save-a-uiimage-in-core-data-and-retrieve-it/

时间: 2024-10-26 08:46:16

iOS Core Data: 存储自定义对象 Save Custom NSObject的相关文章

Core Data存储自定义类型数据

目录: 一.使用CoreData存储基本数据 二.使用CoreData存储自定义类型数据 简单介绍CoreData CoreData是iOS编程中使用持久化数据存储的一种方式,我们知道CoreData并不是数据库本身,而是Apple提供的对象持久化技术--Object Persistent technology.CoreData框架为我们的数据变更.管理.对象存储.读取和恢复提供了支持.下面我们来尝试创建一个简单的CoreData Project. 操作 1. 打开x-code,为你的proje

iOS Core data多线程并发访问的问题

大家都知道Core data本身并不是一个并发安全的架构:不过针对多线程访问带来的问题,Apple给出了很多指导:同时很多第三方的开发者也贡献了很多解决方法.不过最近碰到的一个问题很奇怪,觉得有一定的特殊性,与大家分享一下. 这个问题似乎在7.0.1以前的版本上并不存在:不过后来我升级版本到了7.0.4.app的模型很简单,主线程在前台对数据库进行读写,而后台线程不断地做扫描(只读).为此每个线程中各创建了一个NSManagedObjectContext. 这个模型其实有点奇怪,因为普遍的模型是

iOS: Core Data入门

Core Data是ORM框架,很像.NET框架中的EntityFramework.使用的基本步骤是: 在项目属性里引入CoreData.framework (标准库) 在项目中新建DataModel (生成*.xcdatamodeld文件) 在DataModel里创建Entity 为Entity生成头文件(菜单Editor/Create NSMangedObject Subclass...) 在项目唯一的委托类(AppDelegate.h, AppDelegate.m)里添加managedOb

NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

一.了解NSUserDefaults以及它可以直接存储的类型 NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提,也是大家喜欢用它保存简单数据的一个主要原因. 使用 NSUserDefaults 存储自定义对象的最初,我们必须认识NSUserDefaults可以存储哪一些类型的数据,下面一一列出: NSUserDefaults支持的数据类型有:NSNumber(NSInteger.float.doubl

IOS - CORE DATA的目录(xcode6)

? ?当使用coredata作为app的后台数据存储介质后,我们很想知道数据是否成功插入.为此,我想找到coredata.sqlite的文件 代码中指定的存储目录为: - (NSURL *)applicationDocumentsDirectory { ? ? ? return [[[NSFileManagerdefaultManager] URLsForDirectory:NSDocumentDirectoryinDomains:NSUserDomainMask] lastObject]; }

转-NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

转自:http://my.oschina.net/u/1245365/blog/294449 摘要 NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的是一些信息,这时候就不能直接存储到NSUserDefaults了 目录[-] 一.了解NSUserDefaults以及它可以直接存储的类型 二.使用 NSUserDefaults 存储自定义对象 1.将自定义

Core Data存储数据出错(This NSPersistentStoreCoordinator has no persistent stores (unknown))

Core Data存储数据的时候崩溃,崩溃信息: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo } span.s1 { } reason: 'This NSPersistentStoreCoordinator has no persistent stores (unknown).  It cannot perform a save operation.' 创建一个全局断点,发现最后断点停在存储协调器设置数据库URL的地方.

使用 NSUserDefaults 存储自定义对象

摘要 : NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的是一些信息,这时候就不能直接存储到NSUserDefaults了 一.了解NSUserDefaults以及它可以直接存储的类型 NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提,也是大家喜欢用它保存简单

【Android基础】Android SQLite存储自定义对象

Android SQLite存储自定义对象 在SQLite数据库中可存储的数据类型有NULL.INTEGER.REAL(浮点型).TEXT.BOOL,一共是五种数据类型.在Android开发中,我们存储数据的一般的作法是数据库的属性就是类的成员变量,比如: 要存储一个人的姓名和年龄,在类中的是将它们定义为两个成员变量 class Person{ private String name; private int age; } 数据库中是将它们存储为两个字段 - name TEXT - age IN