思路:將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#import Birthday.h @interface Person : NSObject @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]; } @endBirthday
// // Birthday.h // CoreDataTest // #import@interface Birthday : NSObject @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