티스토리 뷰

Apple/Classes

CoreData singleton sample

아침엔커피한잔 2017. 6. 7. 14:25

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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함