22
NHN NEXT Eunjoo Im iOS Ream.io database NHN NEXT iOS Advanced

Realm.io for iOS

Embed Size (px)

Citation preview

Page 1: Realm.io for iOS

NHNNEXTEunjooIm

iOS

Ream.io

databaseNHN NEXT

iOS Advanced

Page 2: Realm.io for iOS

NHNNEXTEunjooIm

Realm이란?

▪ 빠르게 성장하는 모바일 데이터베이스 (오픈소스)

▪ http://realm.io/kr

▪ SQLite 와 CoreData를 대체할수 있는크로스 플랫폼 데이터베이스

출처: Let’Swift 2016 Realm.io 세션

Page 3: Realm.io for iOS

NHNNEXTEunjooIm

Realm 역사

출처: https://realm.io/kr/

2014년 7월 15일 공개

2년이 지난 지금 Realm 사용 기업

Page 4: Realm.io for iOS

NHNNEXTEunjooIm

C++ 기반의크로스플랫폼

출처: Let’Swift 2016 Realm.io 세션

SQLite 기반이 아니라 고유 C++ 코어를 가짐

Page 5: Realm.io for iOS

NHNNEXTEunjooIm

Realm의장점

출처: https://realm.io/kr/

▪ 빠른 속도

▪ 모바일을 위해서 만들어졌기 때문에,데이타를 저장하고 불러오는 것이 빠르고 효율적

▪ 풍부한 기능

▪ 마이그레이션, 그래프 쿼리, 암호화와 쓰레드 등의 다양한 기능을 지원

▪ 쉬운 사용

▪ Object를 상속하여 쉬운 사용

Page 6: Realm.io for iOS

NHNNEXTEunjooIm

빠른 속도(1): v.s. SQLite

출처: http://static.realm.io/downloads/java/android-benchmark.zip

Page 7: Realm.io for iOS

NHNNEXTEunjooIm

빠른 속도(2): Zero-copy

▪ 기존 ORM은 Copy가 필요

▪ Realm은 Copy가 불필요

▪ memory mapped file 사용

▪ In-memory 처럼 disk 사용

▪ 읽을 데이터의 offset 계산

▪ mapped file에서 읽어옴

▪ property에 access해서 원본값을 반환

▪ Results 자동 업데이트

출처: Let’Swift 2016 Realm.io 세션

Page 8: Realm.io for iOS

NHNNEXTEunjooIm

쉬운 사용(1): 간결한 코드

▪ RLMObject를 상속하여 모델 정의

▪ 속성은 property로 사용하여 정의

▪ 관계와 자료구조는 타겟 타입의 속성이나 RLMArray의 객체 리스트를 포함하여 간단하게 정의

출처: https://realm.io/kr/

Page 9: Realm.io for iOS

NHNNEXTEunjooIm

쉬운 사용(1): 간결한 코드

출처: http://stackoverflow.com/questions/20649350/updating-object-with-core-data-inserts-a-new-record

Entity * entityInstance = nil;entityInstance = [self fetchEntityForID:entityInstanceID inContext:context];

if (entityInstance == nil) {entityInstance = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:context];

}

- (Entity *)fetchEntityForID:(NSNumber *) articleID inContext:(NSManagedObjectContext *) writeContext {

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];NSPredicate * predicate = [NSPredicate predicateWithFormat:@"articleID == %@",articleID];[fetchRequest setPredicate:predicate];

NSArray *fetchedArray = [writeContext executeFetchRequest:fetchRequest error:nil];if ([fetchedArray count] > 0)

return [fetchedArray objectAtIndex:0];return nil;

}

Core data로 insert or update

Page 10: Realm.io for iOS

NHNNEXTEunjooIm

쉬운 사용(1): 간결한 코드

Realm으로 insert or update

출처: https://realm.io/kr/

Page 11: Realm.io for iOS

NHNNEXTEunjooIm

쉬운 사용(2): 다양한 쿼리

▪ Chaining이 가능한 다양한 쿼리 지원 e.g. 필터링

▪ 하나 또는 여러 개의 속성으로 정렬 기준이나 순서 설정

출처: https://realm.io/kr/

Page 12: Realm.io for iOS

NHNNEXTEunjooIm

풍부한 기능(1)

: 암호화

출처: https://realm.io/kr/

▪ 생성 시에 64 바이트 암호화 키를 제공하면 AES-256+SHA2 방식으로 디스크 내 데이터베이스 파일의 암호화를 지원

Page 13: Realm.io for iOS

NHNNEXTEunjooIm

풍부한 기능(2)

: notification

출처: https://realm.io/kr/

▪ addNotificationBlock 메서드를 호출해서 RLMRealm, RLMResults, RLMArray, RLMLinkingObjects가 업데이트될 때마다 통지를 받도록 등록

▪ 단일 RLMObject의 변화를 감지하기 위해 Key-Value Observation을 사용 가능

▪ Realm 객체는 쓰기 트랜잭션 커밋시마다 알림을 보내줌

Page 14: Realm.io for iOS

NHNNEXTEunjooIm

풍부한 기능(3)

: browser

출처: https://realm.io/kr/

▪ 데이터베이스를 읽고 편집할 수 있는 브라우저 제공

Page 15: Realm.io for iOS

NHNNEXTEunjooIm

풍부한 기능(4): Xcode플러그인

출처: https://realm.io/kr/

▪ 새 Realm 모델을 쉽게 만들 수 있는 플러그인 제공

Page 16: Realm.io for iOS

NHNNEXTEunjooIm

풍부한 기능(4): Realm

add-ons

출처: https://realm.io/kr/

▪ Realm 기반의 앱 개발에 도움이 되는 커뮤니티 애드온

Page 17: Realm.io for iOS

NHNNEXTEunjooIm

실습(1): Realm 설정

▪ CocoaPods 이용

▪ Podfile에 pod ‘Realm’을 앱 타겟에 추가하고 pod ‘Realm/Headers’를 테스트 타겟에 추가

▪ 커맨드라인을 통해 pod install을 실행

▪ Static Framework

▪ Realm의 최신 버전을 다운로드해서 압축 풀기

▪ ios/static/ 디렉토리에서 Realm.framework 을 선택하여 Xcode 프로젝트의 File Navigation에 넣기 (Copy items if needed 체크)

▪ Xcode의 File Navigator에서 프로젝트 클릭 > 어플리케이션 대상 선택 > Build Phases > Link Binary with Libraries 의 + 클릭 > libc++.tbd 를 추가

Page 18: Realm.io for iOS

NHNNEXTEunjooIm

실습(2): 모델 설정

#import <Realm/Realm.h>

@interface EJRealmData : RLMObject

@property NSInteger id;@property BOOL status;@property int type;@property int character;@property NSString *title;@property NSDate *date;@property NSString *start;@property NSString *end;@property NSString *current;@property NSString *unit;

@property NSString *startString;@property NSString *endString;@property NSString *now;@property float percent;

@end

RLM_ARRAY_TYPE(EJRealmData)

#import "EJRealmData.h"

@implementation EJRealmData

+ (NSString *)primaryKey {return @"id";

}

+ (NSArray *)requiredProperties {return @[@"id", @"type", @"title"];

}

+ (NSArray *)ignoredProperties {return @[@"startString", @"endString", @"now", @"percent"];

}

+ (NSArray *)indexedProperties {return @[@"status"];

}

+ (NSDictionary *)defaultPropertyValues {return @{@"status" : @YES};

}

@end

<EJRealmData.h> <EJRealmData.m>

기본키

저장하지 않는 속성

인덱스 속성

Page 19: Realm.io for iOS

NHNNEXTEunjooIm

실습(3): 데이터만들기

EJRealmData *newData;EJDataManager *dataManager = [EJDataManager sharedInstance];

newData = [[EJRealmData alloc] initWithValue:@{@"id" : @([dataManager getIdManager]),

@“type" : @(0),@"character" : @(timeCharacterNumber ),@"title" : @"title",@"date" : [NSDate date],@"start" : [NSDate date],@"end" : [NSDate date]

}];

<EJDataManager.m>

순차적인 id 만들기

새 data 만들기

- (int)getIdManager { NSLog(@"idManager: %d", idManager); return idManager++;}

int idManager;+ (EJDataManager *)sharedInstance {

static dispatch_once_t pred;static EJDataManager *shared = nil;dispatch_once(&pred, ^{

shared = [[EJDataManager alloc] init];realm = [RLMRealm defaultRealm];idManager = [[[EJRealmData allObjects] maxOfProperty:@"id"] intValue]++;

});

return shared;}

Page 20: Realm.io for iOS

NHNNEXTEunjooIm

실습(4): 데이터

읽기/쓰기

- (void)addData:(EJRealmData *)data {[realm beginWriteTransaction];[realm addOrUpdateObject:data];[realm commitWriteTransaction];

}

- (void)updateData:(int)id {[realm beginWriteTransaction];EJRealmData *targetData = [self getData:id];targetData.status = NO;[realm commitWriteTransaction];

}

- (NSMutableArray *)getAllData {NSPredicate *pred = [NSPredicate predicateWithFormat:@"status = %hhd", YES];RLMResults *allData = [EJRealmData objectsWithPredicate:pred];

NSMutableArray *resultArray = [[NSMutableArray alloc] init];for (EJRealmData *data in allData) {

[resultArray addObject:[self setProperties:data start:data.start end:data.end type:data.type]];

}

return resultArray;}

add or update

update data

get all data whose status is YES

Page 21: Realm.io for iOS

NHNNEXTEunjooIm

참고자료

https://realm.io/kr/

realm.io/kr

http://www.letswift.kr/2016/

Let’Swift 2016 : Realm 세션

Page 22: Realm.io for iOS

NHNNEXTEunjooIm

ThankYou