티스토리 뷰
https://www.natashatherobot.com/ios-core-data-singleton-example/
http://susemi99.kr/536
// // CoreDataManager.h // ShopLater // // Created by Natasha Murashev on 6/7/13. // Copyright (c) 2013 Natasha Murashev. All rights reserved. // #import foundation foundation.h #import coredata coredata.h @interface CoreDataManager : NSObject + (CoreDataManager *)sharedManager; - (void)saveDataInManagedContextUsingBlock:(void (^)(BOOL saved, NSError *error))savedBlock; - (NSFetchedResultsController *)fetchEntitiesWithClassName:(NSString *)className sortDescriptors:(NSArray *)sortDescriptors sectionNameKeyPath:(NSString *)sectionNameKeypath predicate:(NSPredicate *)predicate; - (id)createEntityWithClassName:(NSString *)className attributesDictionary:(NSDictionary *)attributesDictionary; - (void)deleteEntity:(NSManagedObject *)entity; - (BOOL)uniqueAttributeForClassName:(NSString *)className attributeName:(NSString *)attributeName attributeValue:(id)attributeValue; @end // // Constants.h // ShopLater // // Created by Natasha Murashev on 6/10/13. // Copyright (c) 2013 Natasha Murashev. All rights reserved. // static NSString *sProjectName = @"ShopLater"; // // CoreDataManager.m // ShopLater // // Created by Natasha Murashev on 6/7/13. // Copyright (c) 2013 Natasha Murashev. All rights reserved. // #import "CoreDataManager.h" #import "Constants.h" @interface CoreDataManager () @property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (void)setupManagedObjectContext; @end @implementation CoreDataManager static CoreDataManager *coreDataManager; + (CoreDataManager *)sharedManager { if (!coreDataManager) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ coreDataManager = [[CoreDataManager alloc] init]; }); } return coreDataManager; } #pragma mark - setup - (id)init { self = [super init]; if (self) { [self setupManagedObjectContext]; } return self; } - (void)setupManagedObjectContext { NSFileManager *fileManager = [NSFileManager defaultManager]; NSURL *documentDirectoryURL = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]; NSURL *persistentURL = [documentDirectoryURL URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.sqlite", sProjectName]]; NSURL *modelURL = [[NSBundle mainBundle] URLForResource:sProjectName withExtension:@"momd"]; self.managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; self.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; NSError *error = nil; NSPersistentStore *persistentStore = [self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:persistentURL options:nil error:&error]; if (persistentStore) { self.managedObjectContext = [[NSManagedObjectContext alloc] init]; self.managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator; } else { NSLog(@"ERROR: %@", error.description); } } - (void)saveDataInManagedContextUsingBlock:(void (^)(BOOL saved, NSError *error))savedBlock { NSError *saveError = nil; savedBlock([self.managedObjectContext save:&saveError], saveError); } - (NSFetchedResultsController *)fetchEntitiesWithClassName:(NSString *)className sortDescriptors:(NSArray *)sortDescriptors sectionNameKeyPath:(NSString *)sectionNameKeypath predicate:(NSPredicate *)predicate { NSFetchedResultsController *fetchedResultsController; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:className inManagedObjectContext:self.managedObjectContext]; fetchRequest.entity = entity; fetchRequest.sortDescriptors = sortDescriptors; fetchRequest.predicate = predicate; fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:sectionNameKeypath cacheName:nil]; NSError *error = nil; BOOL success = [fetchedResultsController performFetch:&error]; if (!success) { NSLog(@"fetchManagedObjectsWithClassName ERROR: %@", error.description); } return fetchedResultsController; } - (id)createEntityWithClassName:(NSString *)className attributesDictionary:(NSDictionary *)attributesDictionary { NSManagedObject *entity = [NSEntityDescription insertNewObjectForEntityForName:className inManagedObjectContext:self.managedObjectContext]; [attributesDictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) { [entity setValue:obj forKey:key]; }]; return entity; } - (void)deleteEntity:(NSManagedObject *)entity { [self.managedObjectContext deleteObject:entity]; } - (BOOL)uniqueAttributeForClassName:(NSString *)className attributeName:(NSString *)attributeName attributeValue:(id)attributeValue { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@", attributeName, attributeValue]; NSArray *sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:attributeName ascending:YES]]; NSFetchedResultsController *fetchedResultsController = [self fetchEntitiesWithClassName:className sortDescriptors:sortDescriptors sectionNameKeyPath:nil predicate:predicate]; return fetchedResultsController.fetchedObjects.count == 0; } @end
#import@interface DBManager : NSObject + (DBManager*) sharedInstance; - (NSFetchedResultsController*) fetchAllWithClassName:(NSString*)className cacheName:(NSString*)cacheName; - (NSFetchedResultsController *)fetchEntitiesWithClassName:(NSString *)className sortDescriptors:(NSArray *)sortDescriptors sectionNameKeyPath:(NSString *)sectionNameKeypath predicate:(NSPredicate *)predicate; - (void)saveWithBlock:(void (^)(BOOL saved, NSError *error))savedBlock; - (void)deleteEntity:(NSManagedObject *)entity; - (id)createEntityWithClassName:(NSString *)className attributesDictionary:(NSDictionary *)attributesDictionary; @end #import "DBManager.h" @interface DBManager() @property (strong, strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (strong, strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (strong, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; @end @implementation DBManager static DBManager *_instance; +(DBManager*) sharedInstance { if (!_instance) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [DBManager new]; }); } return _instance; } -(id) init { self = [super init]; if (self) { [self connect]; } return self; } -(void)connect { NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TestCoreData" withExtension:@"momd"]; self.managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; self.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; NSURL *documentsDirectory =[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; NSURL *storeURL = [documentsDirectory URLByAppendingPathComponent:@"TestCoreData3.sqlite"]; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES],NSInferMappingModelAutomaticallyOption, nil]; NSError *error = nil; if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { NSLog(@"===============\nUnresolved error %@, %@", error, [error userInfo]); abort(); } else { self.managedObjectContext = [NSManagedObjectContext new]; [self.managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator]; } } - (NSFetchedResultsController*) fetchAllWithClassName:(NSString*)className cacheName:(NSString*)cacheName { NSFetchRequest *fetchRequest = [NSFetchRequest new]; // Edit the entity name as appropriate. NSEntityDescription *entity = [NSEntityDescription entityForName:className inManagedObjectContext:self.managedObjectContext]; [fetchRequest setEntity:entity]; [fetchRequest setFetchBatchSize:20]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:NO]; NSArray *sortDescriptors = @[sortDescriptor]; [fetchRequest setSortDescriptors:sortDescriptors]; NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:cacheName]; NSError *error = nil; if (![fetchedResultsController performFetch:&error]) { // Replace this implementation with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return fetchedResultsController; } - (NSFetchedResultsController *)fetchEntitiesWithClassName:(NSString *)className sortDescriptors:(NSArray *)sortDescriptors sectionNameKeyPath:(NSString *)sectionNameKeypath predicate:(NSPredicate *)predicate { NSFetchedResultsController *fetchedResultsController; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:className inManagedObjectContext:self.managedObjectContext]; fetchRequest.entity = entity; fetchRequest.sortDescriptors = sortDescriptors; fetchRequest.predicate = predicate; fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:sectionNameKeypath cacheName:nil]; NSError *error = nil; BOOL success = [fetchedResultsController performFetch:&error]; if (!success) { NSLog(@"fetchManagedObjectsWithClassName ERROR: %@", error.description); } return fetchedResultsController; } - (id)createEntityWithClassName:(NSString *)className attributesDictionary:(NSDictionary *)attributesDictionary { NSManagedObject *entity = [NSEntityDescription insertNewObjectForEntityForName:className inManagedObjectContext:self.managedObjectContext]; NSMutableDictionary* dictionary = [NSMutableDictionary dictionaryWithDictionary:attributesDictionary]; [dictionary setValue:[NSDate date] forKey:@"createdAt"]; [dictionary setValue:[NSDate date] forKey:@"updatedAt"]; [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) { [entity setValue:obj forKey:key]; }]; return entity; } - (void)saveWithBlock:(void (^)(BOOL saved, NSError *error))savedBlock { NSError *saveError = nil; savedBlock([self.managedObjectContext save:&saveError], saveError); } - (void)deleteEntity:(NSManagedObject *)entity { [self.managedObjectContext deleteObject:entity]; } @end // fetch all //self.fetchedResultsController = [self.dbManager fetchAllWithClassName:@"Event" cacheName:@"Master"]; // fetch with sort NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; NSArray *sortDescriptors = @[sortDescriptor]; self.fetchedResultsController = [[DBManager sharedInstance] fetchEntitiesWithClassName:@"Event" sortDescriptors:sortDescriptors sectionNameKeyPath:nil predicate:nil]; self.fetchedResultsController.delegate = self; // count NSLog(@"count : %d", self.fetchedResultsController.fetchedObjects.count); // get one NSManagedObject *object = [self.fetchedResultsController.fetchedObjects objectAtIndex:0]; NSLog(@"info : %@", [object valueForKey:@"name"]); NSManagedObject *object = [self.fetchedResultsController.fetchedObjects objectAtIndex:0]; [object setValue:self.nameField.text forKey:@"name"]; NSMutableDictionary *dictionary = [NSMutableDictionary new]; [dictionary setValue:self.nameField.text forKey:@"name"]; [[DBManager sharedInstance] createEntityWithClassName:@"Event" attributesDictionary:dictionary]; [[DBManager sharedInstance] saveWithBlock:^(BOOL saved, NSError *error) { if (!saved) NSLog(@"error : %@", error); else [self.navigationController popViewControllerAnimated:YES]; }]; // fetch all //self.fetchedResultsController = [self.dbManager fetchAllWithClassName:@"Event" cacheName:@"Master"]; // fetch with sort NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; NSArray *sortDescriptors = @[sortDescriptor]; self.fetchedResultsController = [[DBManager sharedInstance] fetchEntitiesWithClassName:@"Event" sortDescriptors:sortDescriptors sectionNameKeyPath:nil predicate:nil]; self.fetchedResultsController.delegate = self; // count NSLog(@"count : %d", self.fetchedResultsController.fetchedObjects.count); // get one NSManagedObject *object = [self.fetchedResultsController.fetchedObjects objectAtIndex:0]; NSLog(@"info : %@", [object valueForKey:@"name"]); NSManagedObject *object = [self.fetchedResultsController.fetchedObjects objectAtIndex:0]; [object setValue:self.nameField.text forKey:@"name"]; NSMutableDictionary *dictionary = [NSMutableDictionary new]; [dictionary setValue:self.nameField.text forKey:@"name"]; [[DBManager sharedInstance] createEntityWithClassName:@"Event" attributesDictionary:dictionary]; [[DBManager sharedInstance] saveWithBlock:^(BOOL saved, NSError *error) { if (!saved) NSLog(@"error : %@", error); else [self.navigationController popViewControllerAnimated:YES]; }];
https://github.com/susemi99/TestCoreData
'Apple > Classes' 카테고리의 다른 글
NSURLSession Code Examples (0) | 2017.06.20 |
---|---|
NSTimer Code Examples (0) | 2017.06.17 |
NSDictionary Code Examples (0) | 2017.06.12 |
NSMutableArray Code Examples (0) | 2017.06.11 |
NSString Code Examples (0) | 2017.06.10 |