본문 바로가기

Develop/Objective C

CoreData를 쓰다가 좀더 편하게 써볼려고 작업질을.

CoreData를 처음 접하고 예전의 사용 습관 때문에 작성하게된 BaseRepository...

목적은 CRUD 는 걍 했으면 좋겠다.. 입니다.

 

Header

#import <Foundation/Foundation.h>

 

@interface BaseRepository : NSObject

 

@property (strong , nonatomic) NSString *entityName;

 

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

 

-(id) initModel;

 

- (NSMutableArray*) getAll;

 

- (id) getByID:(id) objectID;

 

- (void) updateModel:(id) modelObj;

 

- (void) deleteMdoel:(id) modelObj;

 

- (id) getRelation:(id)target attrName:(NSString*) attrName;

 

- (NSMutableSet*) getRelationList:(id)target attrName:(NSString*) attrName;

 

- (NSManagedObjectContext *)getMObjContext;

 

-(NSMutableArray*) sortForNSMutableArray:(NSMutableArray*)list sortName:(NSString*)sortName;

 

 

@end

 

Body

#import "BaseRepository.h"

#import "AppDelegate.h"

 

@implementation BaseRepository

 

@synthesize managedObjectContext;

@synthesize entityName;

 

-(id) initModel{

return [NSEntityDescription insertNewObjectForEntityForName:[self entityName] inManagedObjectContext:[self getMObjContext]];

}

 

- (void) deleteMdoel:(id) modelObj{

NSError *error;

[[self getMObjContext] deleteObject:modelObj];

if (![[self getMObjContext] save:&error]) {

NSLog(@"%@",[error localizedDescription]);

}else{

NSLog(@"success to delete!");

}}

 

 

- (void) updateModel:(id) modelObj

{

NSFetchRequest *retrieveRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *friend = [NSEntityDescription entityForName:[self entityName] inManagedObjectContext:[self getMObjContext]];

 

[retrieveRequest setEntity:friend];

NSError *error;

if (![[self getMObjContext] save:&error]) {

NSLog(@"%@",[error localizedDescription]);

}else{

NSLog(@"success to update!");

}

}

 

-(NSManagedObjectContext *)getMObjContext{

if (managedObjectContext == nil) {

managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

}

return managedObjectContext;

}

 

-(NSManagedObjectContext *)OrgGetMObjContext{

if (managedObjectContext == nil) {

managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

}

 

return managedObjectContext;

}

 

 

- (NSMutableArray*) getAll

{

NSEntityDescription *user = [NSEntityDescription entityForName:[self entityName] inManagedObjectContext:[self getMObjContext]];

NSFetchRequest *retrieveRequest = [[NSFetchRequest alloc] init];

 

[retrieveRequest setEntity:user];

NSError *error;

 

NSMutableArray *friendList = [[[self getMObjContext] executeFetchRequest:retrieveRequest error:&error] mutableCopy];

 

return friendList;

}

 

- (id) getByID:(id) objectID

{

//CoreDataDelegate *coredatadelegate = [[CoreDataDelegate alloc] init];

return nil;

}

 

- (id) getRelation:(id)target attrName:(NSString*) attrName

{

return [target valueForKey:attrName];

}

 

- (NSMutableSet*) getRelationList:(id)target attrName:(NSString*) attrName

{

return [target mutableSetValueForKey:attrName];;

}

 

-(NSMutableArray*) sortForNSMutableArray:(NSMutableArray*)list sortName:(NSString*)sortName{

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:sortName ascending:YES];

NSArray *sorter = [NSArray arrayWithObject:sortByName];

[list sortUsingDescriptors:sorter];

return list;

}

 

@end

 

 

 

작성이후...

지나고 보니.. 꼭 필요 없는 부분같게 느껴집니다.

장점은 각 Model 에 대한 Repository 를 분리해서 나름(?) 편하게 써본다 입니다.

생성조건 패턴을 Repository 에서 처리를 했었는데...

Model 에서 그냥 할껄.. 이라는 생각도 많이 드네요...

Model override 해서 처리 했어도 될만한 일이였습니다.

뭐. 이렇게 삽질하면서.. 얻는거죠. 허허허

 

-- 3월 5일 추가됨 --

CoreDtata schema 에서 변경이 된 경우 자동 생성했을때 작성된 내용이 사라집니다. 손수 변경된 내용에 대해서는 추가 작업을 진행해야 합니다.

동일한 Model을 상속받아서 추가 구현을 하는 것이 좋은 방법으로 보이네요.

그렇게 한다음에 이쁘게.. 처리 해봐야 겠습니다.