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

Realm.io for iOS

Jan 14, 2017

Download

Technology

Eunjoo Im
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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