SlideShare a Scribd company logo
1 of 24
Download to read offline
NHN
 NEXT
 
 차용빈
BabyMoment
 Team
 Study
Realm
: Android  iOS 를 위한 데이터베이스
Realm
Realm
• 모바일 SQLite을 대신할 새로운 데이터베이스
• 모바일을 위한 디자인
• 객체/모델-지향 (ORM은 아님)
• ACID 지원
• Thread Model 지원
Realm
Realm 설치하기(Android Studio)
Maven
1. 의존 저장소로 jcenter를 사용하는지 확인
repositories {
jcenter()
}
Realm
Realm 설치하기(Android Studio)
Maven
2. 프로젝트 의존성 부분에 아래의 내용 추가
dependencies {
compile ‘io.realm:realm-android:0.81.1’
}
Realm
Realm 데이터 모델
Realm 데이터 모델은 Java Bean 모델을 따름
RealmObject를 상속하고 Realm 주석 프로세서가 프록시 클래스를 생성
public class User extends RealmObject {
@PrimaryKey
private String name;
private int age;
@Ignore
private int sessionId;
기본키
: 필드 타입이 문자열이거나 정수(short, int, long)이어야 함
여러 필드(혼합 키)를 기본 키로 사용할 수는 없음
속성 무시
: 필드가 디스크에 저장되지 않도록 할 수 있음
Realm
Realm 데이터 모델
// Standard getters  setters generated by your IDE…
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public int getSessionId() { return sessionId; }
public void setSessionId(int dontPersist) { this.sessionId = sessionId; }
}
Realm
Realm 데이터 쓰기
모든 쓰기 오퍼레이션(추가, 수정, 삭제)은 반드시 쓰기 트랜잭션 내에서 이
루어져야 함.
// Obtain a Realm instance
Realm realm = Realm.getInstance(this);
realm.beginTransaction();
User user = realm.createObject(User.class);
user.setName(John);
user.setEmail(john@corporation.com);
realm.commitTransaction();
객체 생성
Realm
Realm 데이터 쓰기
객체를 커밋하는 대신에 되돌릴려면 쓰기 트랜잭션을 간단하게 취소할 수
있음.
realm.beginTransaction();
User user = realm.createObject(User.class);
// ...
realm.cancelTransaction();
Realm
Realm 데이터 쓰기
수동으로 realm.beginTransaction(), realm.commitTransaction(),
realm.cancelTransaction()을 관리하는 대신에 자동으로 begin/commit을
관리하고 에러가 발생했을 때 cancel 하도록 지원
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
User user = realm.createObject(User.class);
user.setName(John);
user.setEmail(john@corporation.com);
}
});
(트랜잭션 블록)
Realm
Realm 쿼리
John 혹은 Peter라는 이름을 가진 모든 사용자를 쿼리하기 위해서는
// Build the query looking at all users:
RealmQueryUser query = realm.where(User.class);
// Add query conditions:
query.equalTo(name, John);
query.or().equalTo(name, Peter);
// Execute the query:
RealmResultsUser result1 = query.findAll();
Realm
Realm 쿼리
Fluent interface를 사용
RealmResultsUser result2 = realm.where(User.class)
.equalTo(name, John)
.or()
.equalTo(name, Peter)
.findAll();
Realm
Realm 쿼리
Realm 쿼리는 다음과 같은 쿼리를 지원합니다.
• 조건
• 수식어
• 논리 연산자
• 정렬
• 연속 쿼리
• 집합
• 이터레이션
• 삭제
Realm
Realm 객체 닫기
Realm을 사용한 후 Realm 객체를 닫는게 중요
Realm 인스턴스는 레퍼런스 카운팅됩니다. 하나의 쓰레드에서
getInstance()를 두 번 호출하면 사용이 끝난 후 close()도 두 번 호출해야
합니다. 어떠한 쓰레드가 실행될지 걱정없이 Runnable 클래스를 구현하면
됩니다. 간단하게 getInstance()로 시작해서 close()로 끝냅니다
Realm
Realm 객체 닫기
UI 쓰레드를 대상으로 한다면 onDestroy() 메소드에서 realm.close()을 호
출하고, AsyncTask를 대상으로 하면 아래의 패턴이 좋음.
protected Long doInBackground(Context... contexts) {
Realm realm = null;
try {
realm = Realm.getInstance(contexts[0]);
// ... Use the Realm instance
} finally {
if (realm != null) {
realm.close();
}
}
}
Realm
Realm 관계
Realm에서 관계는 대부분 속도 면에서 부담이 없고 관계를 표현하는 내부
구현은 메모리 사용에 상당히 효율적임.
public class Email extends RealmObject {
private String address;
private boolean active;
// ... setters and getters left out
}
public class Contact extends RealmObject {
private String name;
private Email email;
// ... setters and getters left out
}
Realm
Realm 관계
N : 1 관계
public class Contact extends RealmObject {
private Email email;
// Other fields…
}
각 contact는 0 혹은 1 개의 email(Email 인스턴스)을 갖습니다.
보통 이러한 구현은 1 : 1 관계가 일반적입니다.
Realm
Realm 관계
N : N 관계
public class Contact extends RealmObject {
private RealmListEmail emails;
// Other fields…
}
RealmList는 기본적으로 RealmObject의 컨테이너이고 Java의 List와 유
사합니다. 서로 다른 RealmList 동일한 객체를 두 번(혹은 이상) 사용할 수
있습니다
Realm
Realm JSON
JSON JSONObject으로 표현되거나 String InputStream으로 표현된 데이
터를 직접적으로 RealmObject로 추가할 수 있음.
// Insert from a string
realm.beginTransaction();
realm.createObjectFromJson(City.class, { city: Copenhagen, id: 1 });
realm.commitTransaction();
// Insert multiple items using a InputStream
InputStream is = new FileInputStream(new File(path_to_file));
realm.beginTransaction();
try {
realm.createAllFromJson(City.class, is);
realm.commitTransaction();
} catch (IOException e) {
realm.cancelTransaction();
}

More Related Content

What's hot

5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivityJinKyoungHeo
 
자바야 놀자 PPT
자바야 놀자 PPT자바야 놀자 PPT
자바야 놀자 PPTJinKyoungHeo
 
5-4. html5 offline and storage
5-4. html5 offline and storage5-4. html5 offline and storage
5-4. html5 offline and storageJinKyoungHeo
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttpNAVER D2
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발정석 양
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Esun Kim
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형Hyosang Hong
 
C# Game Server
C# Game ServerC# Game Server
C# Game Serverlactrious
 
1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초Circulus
 
Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구ByungJoon Lee
 
5-3. html5 device access
5-3. html5 device access5-3. html5 device access
5-3. html5 device accessJinKyoungHeo
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http RequestNAVER D2
 

What's hot (20)

4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 
5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivity
 
자바야 놀자 PPT
자바야 놀자 PPT자바야 놀자 PPT
자바야 놀자 PPT
 
5-4. html5 offline and storage
5-4. html5 offline and storage5-4. html5 offline and storage
5-4. html5 offline and storage
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 
Node.js 기본과정
Node.js 기본과정Node.js 기본과정
Node.js 기본과정
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
 
4-2. ajax
4-2. ajax4-2. ajax
4-2. ajax
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 
Node.js 심화과정
Node.js 심화과정Node.js 심화과정
Node.js 심화과정
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 
1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초
 
Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구
 
5-3. html5 device access
5-3. html5 device access5-3. html5 device access
5-3. html5 device access
 
Javascript
JavascriptJavascript
Javascript
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
 

Viewers also liked

Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스Leonardo YongUk Kim
 
안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들Sewon Ann
 
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들강 민우
 
Infinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
Infinum Android Talks #16 - Retrofit 2 by Kristijan JurkovicInfinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
Infinum Android Talks #16 - Retrofit 2 by Kristijan JurkovicInfinum
 
Retrofit 2 - O que devemos saber
Retrofit 2 - O que devemos saberRetrofit 2 - O que devemos saber
Retrofit 2 - O que devemos saberBruno Vieira
 
Opensource realm soscon
Opensource realm sosconOpensource realm soscon
Opensource realm sosconMinwoo Park
 
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんRetrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんYukari Sakurai
 
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...Tokuhiro Matsuno
 
Flask, Redis, Retrofit을 이용한 Android 로그인 서비스 구현하기
Flask, Redis, Retrofit을 이용한 Android 로그인 서비스 구현하기Flask, Redis, Retrofit을 이용한 Android 로그인 서비스 구현하기
Flask, Redis, Retrofit을 이용한 Android 로그인 서비스 구현하기Manjong Han
 

Viewers also liked (9)

Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스
 
안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들
 
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
 
Infinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
Infinum Android Talks #16 - Retrofit 2 by Kristijan JurkovicInfinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
Infinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
 
Retrofit 2 - O que devemos saber
Retrofit 2 - O que devemos saberRetrofit 2 - O que devemos saber
Retrofit 2 - O que devemos saber
 
Opensource realm soscon
Opensource realm sosconOpensource realm soscon
Opensource realm soscon
 
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんRetrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
 
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...
 
Flask, Redis, Retrofit을 이용한 Android 로그인 서비스 구현하기
Flask, Redis, Retrofit을 이용한 Android 로그인 서비스 구현하기Flask, Redis, Retrofit을 이용한 Android 로그인 서비스 구현하기
Flask, Redis, Retrofit을 이용한 Android 로그인 서비스 구현하기
 

Similar to Realm @Android

GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GDG Korea
 
[Study]HeadFirst JSP&servlet chapter5
[Study]HeadFirst JSP&servlet chapter5[Study]HeadFirst JSP&servlet chapter5
[Study]HeadFirst JSP&servlet chapter5Hyeonseok Yang
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 patternjinho park
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ patternjinho park
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 releaseJaehyeuk Oh
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발NAVER D2
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Sungjoon Yoon
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
Node.js 팀 스터디 발표자료.
Node.js 팀 스터디 발표자료.Node.js 팀 스터디 발표자료.
Node.js 팀 스터디 발표자료.SeungWoo Lee
 
Realm.io for iOS
Realm.io for iOSRealm.io for iOS
Realm.io for iOSEunjoo Im
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)MIN SEOK KOO
 

Similar to Realm @Android (20)

Java(2/4)
Java(2/4)Java(2/4)
Java(2/4)
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
[Study]HeadFirst JSP&servlet chapter5
[Study]HeadFirst JSP&servlet chapter5[Study]HeadFirst JSP&servlet chapter5
[Study]HeadFirst JSP&servlet chapter5
 
Java(1/4)
Java(1/4)Java(1/4)
Java(1/4)
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ pattern
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 release
 
Clean code appendix 1
Clean code appendix 1Clean code appendix 1
Clean code appendix 1
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
Java script
Java scriptJava script
Java script
 
[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
Node.js 팀 스터디 발표자료.
Node.js 팀 스터디 발표자료.Node.js 팀 스터디 발표자료.
Node.js 팀 스터디 발표자료.
 
Realm.io for iOS
Realm.io for iOSRealm.io for iOS
Realm.io for iOS
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
 

More from Theodore(Yongbin) Cha

O2O 스타트업에서 한 개발자의 이야기
O2O 스타트업에서 한 개발자의 이야기O2O 스타트업에서 한 개발자의 이야기
O2O 스타트업에서 한 개발자의 이야기Theodore(Yongbin) Cha
 
[Objective-C] Objective-C의 메모리 관리 방법
[Objective-C] Objective-C의 메모리 관리 방법[Objective-C] Objective-C의 메모리 관리 방법
[Objective-C] Objective-C의 메모리 관리 방법Theodore(Yongbin) Cha
 
iOS Human Interface Guidelines 정리 (1)
iOS Human Interface Guidelines 정리 (1)iOS Human Interface Guidelines 정리 (1)
iOS Human Interface Guidelines 정리 (1)Theodore(Yongbin) Cha
 

More from Theodore(Yongbin) Cha (6)

O2O 스타트업에서 한 개발자의 이야기
O2O 스타트업에서 한 개발자의 이야기O2O 스타트업에서 한 개발자의 이야기
O2O 스타트업에서 한 개발자의 이야기
 
Android Custom view
Android Custom view Android Custom view
Android Custom view
 
Reactor Proactor 성능분석
Reactor Proactor 성능분석Reactor Proactor 성능분석
Reactor Proactor 성능분석
 
NHN NEXT 개발경험프로젝트
NHN NEXT 개발경험프로젝트NHN NEXT 개발경험프로젝트
NHN NEXT 개발경험프로젝트
 
[Objective-C] Objective-C의 메모리 관리 방법
[Objective-C] Objective-C의 메모리 관리 방법[Objective-C] Objective-C의 메모리 관리 방법
[Objective-C] Objective-C의 메모리 관리 방법
 
iOS Human Interface Guidelines 정리 (1)
iOS Human Interface Guidelines 정리 (1)iOS Human Interface Guidelines 정리 (1)
iOS Human Interface Guidelines 정리 (1)
 

Realm @Android

  • 1. NHN
  • 3.  
  • 7. : Android iOS 를 위한 데이터베이스 Realm
  • 8. Realm • 모바일 SQLite을 대신할 새로운 데이터베이스 • 모바일을 위한 디자인 • 객체/모델-지향 (ORM은 아님) • ACID 지원 • Thread Model 지원
  • 9. Realm Realm 설치하기(Android Studio) Maven 1. 의존 저장소로 jcenter를 사용하는지 확인 repositories { jcenter() }
  • 10. Realm Realm 설치하기(Android Studio) Maven 2. 프로젝트 의존성 부분에 아래의 내용 추가 dependencies { compile ‘io.realm:realm-android:0.81.1’ }
  • 11. Realm Realm 데이터 모델 Realm 데이터 모델은 Java Bean 모델을 따름 RealmObject를 상속하고 Realm 주석 프로세서가 프록시 클래스를 생성 public class User extends RealmObject { @PrimaryKey private String name; private int age; @Ignore private int sessionId; 기본키 : 필드 타입이 문자열이거나 정수(short, int, long)이어야 함 여러 필드(혼합 키)를 기본 키로 사용할 수는 없음 속성 무시 : 필드가 디스크에 저장되지 않도록 할 수 있음
  • 12. Realm Realm 데이터 모델 // Standard getters setters generated by your IDE… public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getSessionId() { return sessionId; } public void setSessionId(int dontPersist) { this.sessionId = sessionId; } }
  • 13. Realm Realm 데이터 쓰기 모든 쓰기 오퍼레이션(추가, 수정, 삭제)은 반드시 쓰기 트랜잭션 내에서 이 루어져야 함. // Obtain a Realm instance Realm realm = Realm.getInstance(this); realm.beginTransaction(); User user = realm.createObject(User.class); user.setName(John); user.setEmail(john@corporation.com); realm.commitTransaction(); 객체 생성
  • 14. Realm Realm 데이터 쓰기 객체를 커밋하는 대신에 되돌릴려면 쓰기 트랜잭션을 간단하게 취소할 수 있음. realm.beginTransaction(); User user = realm.createObject(User.class); // ... realm.cancelTransaction();
  • 15. Realm Realm 데이터 쓰기 수동으로 realm.beginTransaction(), realm.commitTransaction(), realm.cancelTransaction()을 관리하는 대신에 자동으로 begin/commit을 관리하고 에러가 발생했을 때 cancel 하도록 지원 realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { User user = realm.createObject(User.class); user.setName(John); user.setEmail(john@corporation.com); } }); (트랜잭션 블록)
  • 16. Realm Realm 쿼리 John 혹은 Peter라는 이름을 가진 모든 사용자를 쿼리하기 위해서는 // Build the query looking at all users: RealmQueryUser query = realm.where(User.class); // Add query conditions: query.equalTo(name, John); query.or().equalTo(name, Peter); // Execute the query: RealmResultsUser result1 = query.findAll();
  • 17. Realm Realm 쿼리 Fluent interface를 사용 RealmResultsUser result2 = realm.where(User.class) .equalTo(name, John) .or() .equalTo(name, Peter) .findAll();
  • 18. Realm Realm 쿼리 Realm 쿼리는 다음과 같은 쿼리를 지원합니다. • 조건 • 수식어 • 논리 연산자 • 정렬 • 연속 쿼리 • 집합 • 이터레이션 • 삭제
  • 19. Realm Realm 객체 닫기 Realm을 사용한 후 Realm 객체를 닫는게 중요 Realm 인스턴스는 레퍼런스 카운팅됩니다. 하나의 쓰레드에서 getInstance()를 두 번 호출하면 사용이 끝난 후 close()도 두 번 호출해야 합니다. 어떠한 쓰레드가 실행될지 걱정없이 Runnable 클래스를 구현하면 됩니다. 간단하게 getInstance()로 시작해서 close()로 끝냅니다
  • 20. Realm Realm 객체 닫기 UI 쓰레드를 대상으로 한다면 onDestroy() 메소드에서 realm.close()을 호 출하고, AsyncTask를 대상으로 하면 아래의 패턴이 좋음. protected Long doInBackground(Context... contexts) { Realm realm = null; try { realm = Realm.getInstance(contexts[0]); // ... Use the Realm instance } finally { if (realm != null) { realm.close(); } } }
  • 21. Realm Realm 관계 Realm에서 관계는 대부분 속도 면에서 부담이 없고 관계를 표현하는 내부 구현은 메모리 사용에 상당히 효율적임. public class Email extends RealmObject { private String address; private boolean active; // ... setters and getters left out } public class Contact extends RealmObject { private String name; private Email email; // ... setters and getters left out }
  • 22. Realm Realm 관계 N : 1 관계 public class Contact extends RealmObject { private Email email; // Other fields… } 각 contact는 0 혹은 1 개의 email(Email 인스턴스)을 갖습니다. 보통 이러한 구현은 1 : 1 관계가 일반적입니다.
  • 23. Realm Realm 관계 N : N 관계 public class Contact extends RealmObject { private RealmListEmail emails; // Other fields… } RealmList는 기본적으로 RealmObject의 컨테이너이고 Java의 List와 유 사합니다. 서로 다른 RealmList 동일한 객체를 두 번(혹은 이상) 사용할 수 있습니다
  • 24. Realm Realm JSON JSON JSONObject으로 표현되거나 String InputStream으로 표현된 데이 터를 직접적으로 RealmObject로 추가할 수 있음. // Insert from a string realm.beginTransaction(); realm.createObjectFromJson(City.class, { city: Copenhagen, id: 1 }); realm.commitTransaction(); // Insert multiple items using a InputStream InputStream is = new FileInputStream(new File(path_to_file)); realm.beginTransaction(); try { realm.createAllFromJson(City.class, is); realm.commitTransaction(); } catch (IOException e) { realm.cancelTransaction(); }
  • 25. Realm Realm Notification Listener를 추가해서 사용하는 UI 혹은 다른 쓰레드가 Realm이 변경될 때 감지할 수 있음. realm.addChangeListener(new RealmChangeListener() { @Override public void onChange() { // ... do something with the updates (UI, etc.) ... } });
  • 26. Realm Realm 암호화 Realm 파일은 512-bit 암호화 키를 Realm.getInstance() 호출에 전달하여 암호화된 상태로 저장 byte[] key = new byte[64]; new SecureRandom().nextBytes(key); Realm realm = Realm.getInstance(this, key); // ... use the Realm as normal ... 이 기능을 통해 디스크의 모든 데이터를 AES-256 암호화를 사용하여 쉽게 암호화, 복호화할 수 있음.
  • 27. Realm Realm GSON Gson gson = new GsonBuilder() .setExclusionStrategies(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { return f.getDeclaringClass().equals(RealmObject.class); } @Override public boolean shouldSkipClass(Class? clazz) { return false; } }) .create(); String json = { name : 'John', email : 'john@corporation.com' }; User user = gson.fromJson(json, User.class);
  • 28. Realm Realm Retrofit Retrofit은 내부적으로 GSON을 사용하므로 JSON 데이터에서 RealmObject로 역직렬화할 필요성이 있다면 GsonConverter 설정 (앞 슬라이드에서의 Gson 설정 후 아래 설정 내용 추가) RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(https://api.github.com) .setConverter(new GsonConverter(gson)) .build(); GitHubService service = restAdapter.create(GitHubService.class);
  • 29. Realm Realm Retrofit Retrofit은 자동적으로 객체를 Realm에 추가하지 않으며 수동으로 realm.copyToRealm() 메소드를 사용해서 추가해야 함. GitHubService service = restAdapter.create(GitHubService.class); ListRepo repos = service.listRepos(octocat); // Copy elements from Retrofit to Realm to persist them. realm.beginTransaction(); ListRepo realmRepos = realm.copyToRealm(repos); realm.commitTransaction();