Upload
eunjoo-im
View
105
Download
0
Embed Size (px)
Citation preview
NHNNEXTEunjooIm
iOS
Ream.io
databaseNHN NEXT
iOS Advanced
NHNNEXTEunjooIm
Realm이란?
▪ 빠르게 성장하는 모바일 데이터베이스 (오픈소스)
▪ http://realm.io/kr
▪ SQLite 와 CoreData를 대체할수 있는크로스 플랫폼 데이터베이스
출처: Let’Swift 2016 Realm.io 세션
NHNNEXTEunjooIm
Realm 역사
출처: https://realm.io/kr/
2014년 7월 15일 공개
2년이 지난 지금 Realm 사용 기업
NHNNEXTEunjooIm
C++ 기반의크로스플랫폼
출처: Let’Swift 2016 Realm.io 세션
SQLite 기반이 아니라 고유 C++ 코어를 가짐
NHNNEXTEunjooIm
Realm의장점
출처: https://realm.io/kr/
▪ 빠른 속도
▪ 모바일을 위해서 만들어졌기 때문에,데이타를 저장하고 불러오는 것이 빠르고 효율적
▪ 풍부한 기능
▪ 마이그레이션, 그래프 쿼리, 암호화와 쓰레드 등의 다양한 기능을 지원
▪ 쉬운 사용
▪ Object를 상속하여 쉬운 사용
NHNNEXTEunjooIm
빠른 속도(1): v.s. SQLite
출처: http://static.realm.io/downloads/java/android-benchmark.zip
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 세션
NHNNEXTEunjooIm
쉬운 사용(1): 간결한 코드
▪ RLMObject를 상속하여 모델 정의
▪ 속성은 property로 사용하여 정의
▪ 관계와 자료구조는 타겟 타입의 속성이나 RLMArray의 객체 리스트를 포함하여 간단하게 정의
출처: https://realm.io/kr/
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
NHNNEXTEunjooIm
쉬운 사용(1): 간결한 코드
Realm으로 insert or update
출처: https://realm.io/kr/
NHNNEXTEunjooIm
쉬운 사용(2): 다양한 쿼리
▪ Chaining이 가능한 다양한 쿼리 지원 e.g. 필터링
▪ 하나 또는 여러 개의 속성으로 정렬 기준이나 순서 설정
출처: https://realm.io/kr/
NHNNEXTEunjooIm
풍부한 기능(1)
: 암호화
출처: https://realm.io/kr/
▪ 생성 시에 64 바이트 암호화 키를 제공하면 AES-256+SHA2 방식으로 디스크 내 데이터베이스 파일의 암호화를 지원
NHNNEXTEunjooIm
풍부한 기능(2)
: notification
출처: https://realm.io/kr/
▪ addNotificationBlock 메서드를 호출해서 RLMRealm, RLMResults, RLMArray, RLMLinkingObjects가 업데이트될 때마다 통지를 받도록 등록
▪ 단일 RLMObject의 변화를 감지하기 위해 Key-Value Observation을 사용 가능
▪ Realm 객체는 쓰기 트랜잭션 커밋시마다 알림을 보내줌
NHNNEXTEunjooIm
풍부한 기능(3)
: browser
출처: https://realm.io/kr/
▪ 데이터베이스를 읽고 편집할 수 있는 브라우저 제공
NHNNEXTEunjooIm
풍부한 기능(4): Xcode플러그인
출처: https://realm.io/kr/
▪ 새 Realm 모델을 쉽게 만들 수 있는 플러그인 제공
NHNNEXTEunjooIm
풍부한 기능(4): Realm
add-ons
출처: https://realm.io/kr/
▪ Realm 기반의 앱 개발에 도움이 되는 커뮤니티 애드온
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 를 추가
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>
기본키
저장하지 않는 속성
인덱스 속성
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;}
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
NHNNEXTEunjooIm
참고자료
https://realm.io/kr/
realm.io/kr
http://www.letswift.kr/2016/
Let’Swift 2016 : Realm 세션
NHNNEXTEunjooIm
ThankYou