2014년 7월 11일 금요일

[iOS] CoreData관련한 몇가지 정리할 내용들..

개발하면서, CoreData를 사용할 때 필요한 내용을 정리합니다.

RAW SQL

CoreData관련 코드를 작성하고 테스트하다 보면, 실제 SQL이 어떻게 동작되는지 궁금할 때가 있습니다.
어떤 SQL문이 언제 호출이 되어서 실행이 되는지 보면, Commit을 언제 해야 될지 적절할 시기를 알 수 있습니다.
XCode의  Scheme을 드롭다운해서 열고, Edit Scheme을 선택, 'Run {app name}'을 선택하고, Arguments 탭에서 Arguments Passed On Launch에 '+'버튼을 선택해서 아래 내용을 추가합니다.
'-com.apple.CoreData.SQLDebug 1'
그리고 실행을 하면, 실제 SQL문이 어떻게 호출 되는지 표시가 됩니다.


CoreData에서 Object가져오기.

AppDelegate에 추가한 함수를 통해서 managedContext를 받아와야 읽거나, 저장할 수 있습니다.
CoreData에서 데이터를 fetch해서 가져오기 위해서, NSFetchRequest를 만들고, executeFetchRequest를 통해서, NSManagedObject의 형태로 받아 옵니다.
받아올 때, 필터링하기 위해서,  NSPredicate를 설정하고, 정렬해서 보기 위해서 NSSortDescriptor를 설정합니다.

- (void) function
{
    NSError *error;
    SPQAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
    NSManagedObjectContext *managedContext = [appDelegate managedObjectContext];
    
    NSFetchRequest *request;
    request = [NSFetchRequest fetchRequestWithEntityName:entityName];
    request.predicate = [NSPredicate predicateWithFormat:@"name = %@ && created=%@", name, (created)?@"YES":@"NO"];
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    NSArray *items = [managedContext executeFetchRequest:request error:&error];
    if (error != nil) {
        NSLog(@"executeFetchRequest: %@", [error localizedDescription]);
    }
  //....

}


새로운 Object 만들기

신규로 object를 만들고, 거기에 값을 넣은 후, 저장을 하면, CoreData에 저장이된다.
    item = [NSEntityDescription insertNewObjectForEntityForName:entityName //추가할 entity이름
                                         inManagedObjectContext:managedContext];


기존 Object 지우기.

managedObject를 찾은 다음, 그 object를 manageObjectContext에서 삭제하면 된다.
    [managedContext deleteObject:item]; //item은 NSManageObject 임.

Boolean값을 비교하기

predicate를 만들 때, String은 '=='로 비교를 하지만, Bool인 경우에는 NSNumber를 이용해서 비교를 해야 한다.
    [NSPredicate predicateWithFormat:@"name == %@, created == %@", name, [NSNumber numberWithBool:created]];

제가 필요한 것만 정리를 해 둡니다.