2014년 3월 4일 화요일

[iOS/OSX] CoreData #2 삭제, 검색​ 그리고 정렬​

CoreData 이야기 2편. 이번엔 삭제와 검색 및 정렬에 대한 이야기이다.


삭제

컨텍스트의 deleteObject: 를 이용하면 엔티티가 삭제된다.
TestEntity *e = [objects objectAtIndex:1];
[self.context deleteObject:e];
[self.context save:&error];
위 예제 코드는 앞 포스트에서 가져온 레코드 중 2번째의 오브젝트를 DB에서 영원히 볼 수 없게 만드는 코드이다.

컨텍스트의 save 메소드에 대한 이야기

지금까지 별도로 언급하지 않았던 것이 있다. CoreData는 모든 레코드를 메모리에 미러링시키는 것과 비슷한 개념을 이용한다. 메모리 상의 내용을 수정하면 DB에도 그대로 반영하는 메카니즘이다. 실제로 save 메소드의 기능은 이런 메모리상의 수정사항을 그대로 DB에 반영하는 기능이다.

지금까지의 예제(삽입/수정/삭제 시)에서 매 번 필요 할 때 마다 컨텍스트에서 save 메소드를 호출했다. 이 방법이 틀린 것은 아니고 오히려 즉시 데이터가 데이터베이스에 반영되도록 해 주는 아주 좋은 방법일지도 모른다.

하지만 매번 커밋(commit) 이 일어난다는 건 퍼포먼스 상 좋지 않은 영향을 줄 수도 있다.

context의 save 메소드는 모든 반영 상황을 한번에 기록하기 위한 메소드다. 따라서 삽입이나 수정 시 원하는 작업을 한번에 모두 해 두고 save는 한 번만 호출해도 된다.

검색

검색은 이전 포스트의 예제인 NSFetchRequest에 NSPredicate를 세팅하는 방법으로 이루어진다.
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
fetch.entity = [NSEntityDescription entityForName:@"TestEntity"
                           inManagedObjectContext:self.context];

fetch.predicate = [NSPredicate predicateWithFormat:@"done == YES"];

NSError *error = nil;
NSArray *objects = [self.context executeFetchRequest:fetch error:&error];
if (error) {
    NSLog(@"Failed to fetch objects: %@", [error description]);
}
실제로 앞의 예제에서 변경된 점은 NSPredicate를 추가했다는 점 뿐이다.

NSPredicate의 predicteWithFormat: 메서드는 쿼리(질의)문을 텍스트로 입력 할 수 있다. 그래서 특정한 포맷의 명령어를 이용해 ​SQL의 Matching 이나 AND/OR 같은 논리 질의를 추가 할 수 있다.

위 예제는 NSNumber의 boolValue 타입인 done 이라는 attribute의 값이 YES인 레코드를 검색하는 방법이다. 쿼리에 대한 자세한 내용은 NSPredicate 문서를 참고하자.

정렬

정렬은 NSSortDescriptor 를 이용해서 할 수 있다.
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
fetch.entity = [NSEntityDescription entityForName:@"TestEntity"
                           inManagedObjectContext:self.context];

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"when" ascending:YES];
fetch.sortDescriptors = [NSArray arrayWithObject:sort];

NSError *error = nil;
NSArray *objects = [self.context executeFetchRequest:fetch error:&error];
if (error) {
    NSLog(@"Failed to fetch objects: %@", [error description]);
}
NSSortDescription를 사용해 TestEntity 타입의 레코드의 when 필드를 기준으로 오름차순 정렬을 하는 예제이다. sort라는 변수에 오브젝트를 할당하고 있는 부분을 보면 대충 가늠 가능할 것이다.

Sort Descriptor 는 하나 이상이 사용 될 수 있다. 위의 예제에서도 NSArray 형태로 Sort Descriptor를 만들어서 세팅하고 있다. 이건 SQL의 ORDER BY 문법을 생각해 보면 왜 그런지 ​이해 할 수 있을 것이다.

관련​포스트:

댓글 없음 :