iOS2013. 1. 15. 17:11


출처 : http://blog.naver.com/PostView.nhn?blogId=gigar&logNo=60130114031


[AppDelegate내에서 managedObjectContext객체 생성 및 준비과정]

NSManagedObject 관리객체

코어데이터로 저장하고 불러올수 있는 객체


NSManagedObjectContext 관리객체 컨텍스트

관리객체를 담는 그릇. 관리객체 컨텍스트에 관리객체가 포함되어 있음


NSPersistentStoreCoordinator 저장소 관리자

컨텍스트 내용을 파일이나 데이터베이스에 저장하는 객체


NSEntityDescription 엔티티

데이터 베이스의 테이블 구조


NSManagedObjectModel

엔티티를 모아놓은 공간


NSPropertyDescription

엔티티를 이루는 요소. 속성, 관계, 동적인 검색프로퍼티가 있다


NSFetchRequest

관리 객체 컨텍스트에서 객체를 검색할때 조건을 기술한 객체


NSPredicate

검색 요청에서 검색조건을 기술할때 사용


NSFetchedResultsController

테이블뷰가 사용하기 쉽게 검색 결과를 관리하는 도움 클래스 


코어데이터를 이용하는 일반적인 절차


1. 관리객체 컨텍스트 생성

2. 관리객체 컨텍스트에 관리객체를 검색

3. 관리객체 컨텍스트에 객체를 추가, 수정, 삭제

4. 실행 취소, 반복 처리

5. 저장소에 저장




--------------------------------------------------------------------------------------------------

[다른 클래스 내에서 사용과정]


AppDelegate 클래스에서 생성한 managedObjectContext를 다른 클래스에서도 사용하도록 하기 위해

AppDelegate객체에 접근하여 managedObjectContext를 사용하고자 한다.


어플리케이션에서 AppDelegate 클래스는 하나만 존재하기 때문에 싱글톤으로 관리할 변수가 있을 경우 다르게 구현해도 되지만,

AppDelegate에 프로퍼티로 설정하여 가져다 쓰면 된다.

다른 클래스에서 AppDelegate에 접근하고자 하고 싶을 때에는 다음과 같이 접근 가능하다

 [[UIApplication sharedApplication] delegate];


사용하고자 하는 클래스 내에 지정한 managedObjectContext의 객체를 초기화 할때

AppDelegate의 managedObjectContext 객체를 가져와 값으로 넣도록 한다.

 -(NSManagedObjectContext*)managedObjectContext {

if (managedObjectContext == nil) {

TestAppDelegate* delegate = (TestAppDelegate*)[[UIApplication sharedApplication] delegate];

managedObjectContext = [delegate managedObjectContext];

// if

return managedObjectContext;

// managedObjectContext


이제 CoreData를 사용하여 실제적으로 데이터를 가져오고 쓰고, 지우는 과정이다.

 /*read*/


NSError* error;

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

NSEntityDescription* dataEntity = [NSEntityDescription entityForName:@"CodeData" inManagedObjectContext:self.managedObjectContext];

[fetchRequest setEntity:dataEntity];

NSPredicate* predicate;


CodeData* codeData = nil;


predicate = [NSPredicate predicateWithFormat:@"code_type = %@ AND code_name = %@", codeType, codeName];

[fetchRequest setPredicate:predicate];

NSArray* data_list = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

if([data_list count] > 0){

codeData = [data_list objectAtIndex:0];

}

[fetchRequest release];


 /*write*/


NSError* error;

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

NSEntityDescription* dataEntity = [NSEntityDescription entityForName:@"CodeData"

                                              inManagedObjectContext:self.managedObjectContext];

[fetchRequest setEntity:dataEntity];

NSPredicate* predicate;

CodeData* codeData = (CodeData*)[NSEntityDescription insertNewObjectForEntityForName:@"CodeData" 

                                              inManagedObjectContext:self.managedObjectContext];

codeData.code_type = codeType;

codeData.code_name = [codeDic objectForKey:DATA_VALUE];

codeData.code_desc = [codeDescDic objectForKey:DATA_VALUE];

[self.managedObjectContext insertObject:codeData]; //저장


[self.managedObjectContext save:&error]; //DB 커밋

[fetchRequest release];


 /*delete*/


NSError* error;

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

NSEntityDescription* dataEntity = [NSEntityDescription entityForName:@"CodeData"

                                              inManagedObjectContext:self.managedObjectContext];

[fetchRequest setEntity:dataEntity];

CodeData* codeData = (CodeData*)[NSEntityDescription insertNewObjectForEntityForName:@"CodeData" 

                                              inManagedObjectContext:self.managedObjectContext];

codeData.code_type = codeType;

codeData.code_name = [codeDic objectForKey:DATA_VALUE];

codeData.code_desc = [codeDescDic objectForKey:DATA_VALUE];


[self.managedObjectContext deleteObject:tempData];//삭제


[self.managedObjectContext save:&error]; //DB 커밋

[fetchRequest release];

[출처] CoreData 사용(수정 중)|작성자 gigar


Posted by 삼스