2010년 2월 23일 화요일

CoreData

  코어 데이터는 코드 작성 없이 애플리 케이션의 데이터 모델을 시각적으로 설계할 수 있도록 해주는 애플의 도구이다.
  애플은 아이폰 SDK 3부터 코어 데이터를 지원하기 시작했다.

[프로젝트 생성]

  • Xcode에서 New Project 창을 연다.
  • Window-based Application 템플릿을 선택하고, 하단에 있는 Use Core Data for storage 옵션을 체크한 후 Choose... 버튼을 클릭한다.
  • 프로젝트명을 쓰고 프로젝트를 생성합니다.

프로젝트를 생성하고 보면, Resources폴더에 *.xcdatamodel이라는 이름의 파일이 있습니다.
이 파일은 데이터 모델 파일이며, 이 파일을 열면 데이터모델 편집기가 실행되는 것을 볼 수 있습니다.
(세부 창 숨기기 shift+command+E)


  코코아에서 데이터 모델을 생성하는 일반적인 방법은 NSObject의 하위클래스를 만들어서 NSCoding과 NSCopying을 따르게 하여 아카이브로 만드는 것입니다.
  하지만 코어 데이터에서는 클래스 대신 데이터 모델 편집기에서 엔티티를 생성하고, 엔티티에서 관리객체를 만드는 코드를 작성합니다.

  엔티티는 속성, 관계, 페치드 프로퍼티, 페치 리쿼스트 총 4개 타입의 프로퍼티로 구성되며, Xcode의 모델 편집기를 통해 정의된다. 페치 리쿼스트는 데이터 모델 편집기나 소스코드에서 미리 정의될 수 있습니다.
  • 속성 : 오브젝티브 C 클래스의 인스턴스 변수에 해당하는 코어 데이터 엔티티의 함수. 데이터 저장에 사용
  • 관계 : 엔티티 사이의 관계를 정의. 관계는 하나 혹은 그 이상일 수 있음.
  • 페치드 프로퍼티 : 관계와 동시에 사용될 수 없다. 즉, 둘중 하나를 선택해 사용해야 함.  관계와의 차이점은 로딩방식이 다르다는 것인데, 관계의 경우 한속성이 로드될때 그와 관계된 다른 속성도 같이 로드되지만, 페치드 프로퍼티는 다른 속성에 접근하지 않는한 연관된 다른속성은 한꺼번에 로드되지 않음.
  • 페치 리퀘스트 : 미리 정의된 쿼리.

[관리객체 가져오기]

  저장소에서 관리객체를 가져오려면 페치 리쿼스트를 하나 만들고 객체의 엔티티나 가져오길 원하는 객체를 명시한 NSEntityDescription을 사용하여 요청해야 합니다.

예]
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescr = [NSEntityDescription entityForName:@"EntityName"
                                                          inManagedObjectContext:context];
[request setEntity:entityDescr];

  필요하다면 NSPredicate를 사용한 페치 리퀘스트의 조건을 명시할 수 있습니다.
  NSPredicate는 페치 리퀘스트의 실행 결과를 만들기 위해 필요한 기준을 정의하기 위해 사용되며 SQL문과 유사합니다.

예]
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name = %@)",nameString];
[request setPredicate:pred];

  첫줄에 생성한 NSPredicate는 페치 리퀘스트에 명시된 엔티티의 모든 객체를 가져오는 대신 name 프로퍼티에 nameString 값이 저장되어 있는 객체만을 가져오게 합니다.

  엔티티 디스크립션과 함께 페치 리퀘스트를 생성하고 나면 NSManagedObjectContext:인스턴스 메서드를 사용하여 패치 리퀘스트를 실행합니다.

예]
NSError *error;
NSArray *objects = [context executeFetchRequest:request error:&error];
if(objects == nil){
  //handle error
}

  executeFetchRequest:error:는 저장소로부터 특정 객체를 불러올 것이며 배열을 통해 객체를 반환할 것입니다.
  만일 에러가 발생하면 배열 대신 nil값을 반환받게 될 것이고 인자로 사용한 error 포인터는 에러의 내용이 담긴 NSError 객체를 가리키게 될 것입니다.
  에러가 발생하지 않으면 명시된 기준과 일치하는 데이터가 없어서 아무런 값을 담고 있지 않더라도 제대로 된 배열을 받환받게 될 것입니다.
  배열을 받환받는 시점부터 배열 안의 관리객체에 대한 모든 변경 내용은 관리객체 컨텍스트에 의해 기록될 것이며 컨텍스트에 save:메시지를 보내면 저장될 것입니다.


댓글 없음:

댓글 쓰기

내 블로그 목록

팔로어