SlideShare une entreprise Scribd logo
1  sur  36
Télécharger pour lire hors ligne
RealmAndroid で
Realm を使ってみよう
Introduction to Realm for Android
Application Development Division
Android Team, Ryutaro Miyashita
2015.03.14
RealmRyutaro Miyashita
Mobile Application Engineer / ChatWork
DroidKaigi は落ちました
Realm
ChatWork とは
ビジネス向けのチャットツールです
導入社数 60,000 を突破
多職種が入り交じる大きな企業や、非 IT 系の中小企業を中心に導入
利用技術はアグレッシブ
Realm をはじめとして、Scala や周辺 SaaS, AWS などをフル活用
Realm
Realm
1. NoSQL 型の DB + ORM
2. C++ 製の Realm-Core
3. iOS /Android 両対応
4. とても速い!
RealmRealm を使ってみよう
Realm使い始めるのは簡単
Realm
build.gradle に記述して Sync する
dependencies {
compile 'io.realm:realm-android:0.80.0'
}
Realm
モデルを書く = テーブル定義を書く
public class User extends RealmObject {
@PrimaryKey
private long id;
@Index
private String name;
// Getter と Setter は省略
}
Realm
Realm realm = Realm.getInstance(/* Context */);
// Retrolambda
realm.executeTransaction(_realm -> {
User user = _realm.createObject(User.class);
user.setId(1);
user.setName("John Doe");
});
realm.close();
トランザクションの中でオブジェクトを作る
Realm
Realm realm = Realm.getInstance(/* Context */);
User user = realm.where(User.class)
.equalTo("id", 1)
.findFirst();
realm.close();
メソッドチェインでクエリを作ってオブジェクトを取り出す
iOS 版では NSPredicate like な検索だが、Android ではクエリビルダ
Realm他の永続化機構との比較
Realm
Realm SQLiteShared
Preferences
簡単
XML KVS
遅い
面倒
RDBMS
速い
簡単
NoSQL RDB
速い
いいとこ取り:)
Realm
Realm ActiveAndroid
ORM (SQLite)
ActiveRecord
遅い
簡単
NoSQL RDB
速い
いいとこ取り:)
Realm
初期化時間[ms]
0
4000
8000
12000
16000
Realm ActiveAndroid
15,544 ms
5,054 ms
Insert 件数 10,000 件
Nexus 4 / Android 5.0.1
JSON → Object
Realm実際に Realm を使うなら
Realm暗号化
Realmbyte[] key = new byte[64];
new SecureRandom().nextBytes(key);
Realm realm = Realm.getInstance(/* Context */, key);
byte 型の配列を長さ 64 で作る
SecureRandom#nextBytes を使って乱数バイトを取り出す
暗号化を使っても速度にそこまで影響しない!
Realm
初期化時間[ms]
0
4000
8000
12000
16000
Realm ActiveAndroid
15,544 ms
5,054 ms
Insert 件数 10,000 件
Nexus 4 / Android 5.0.1
JSON → Object
↓
暗号化を使った結果
Realmbyte[] key = new byte[64];
new SecureRandom().nextBytes(key);
Realm realm = Realm.getInstance(/* Context */, key);
ドキュメントとサンプルの情報の整合性が取れていない
Key の保存方法は提示されていない
ドキュメントは
32 になっている
サンプルは単純な
Random になっている
どこかに保存したい
Realm
Key を作ったらファイルにして保存する
Key ファイルがあれば読み出して byte 配列に格納する
byte[] key;
File keyFile = context.getFileStreamPath(FILE_NAME);
if (keyFile.exists()) {
key = Files.readFromFile(keyFile, 64);
} else {
key = new byte[64];
new SecureRandom().nextBytes(key);
Files.byteToFile(context, key, FILE_NAME);
}
http://goo.gl/GIK2qXFiles →
RealmRealm オブジェクト
Realm
Realm realm;
try {
realm = Realm.getInstance(/* Context */, key);
} finally {
if (realm != null) realm.close();
}
Realm を操作するときは Realm#getInstance を経由する
Realm オブジェクトは使い終わったら close が必要である
Realmtry (Realm realm = Realm.getInstance(/* Context */, key)) {
// do something
}
Android 4.4 以上であれば try-with-resources が使える
でも、4.4 以上をターゲットにできるのは多分、来世
Realm
public class MainActivity extends ActionBarActivity {
private Realm mRealm;
@Override
protected void onCreate(Bundle savedInstanceState) {
mRealm = Realm.getInstance(getApplicationContext());
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mRealm != null) mRealm.close();
}
}
Activity の中であれば、インスタンス変数として保持してしまう
onResume のタイミングで null チェックすると良いかも
onDestroy のタイミングで close する
Realmマルチスレッド
Realm
Realm realm = Realm.getInstance(/* Context */, key);
User user = realm.where(User.class)
.equalTo("id", 1)
.findFirst();
// Retrolambda
new Thread(() -> {
Log.d(TAG, user.getName());
}).start();
realm.close();
一見動きそうではある
Realm
// Retrolambda
new Thread(() -> {
Realm realm = Realm.getInstance(/* Context */, key);
User user = realm.where(User.class)
.equalTo("id", 1)
.findFirst();
Log.d(TAG, user.getName());
realm.close();
}).start();
Thread の中で Realm オブジェクトそのものから取得し直す必要がある
Realm オブジェクトの close 忘れに要注意
Realm注意したいところ
Realm
public class User extends RealmObject {
@PrimaryKey
private long id;
@Index
private String name;
// Getter と Setter は省略
}
モデルのフィールドに使える型は制約がある (詳細リンク)
全てのフィールドは private かつ、Getter / Setter が必要である
equals, hashCode, toString も含めて、メソッドを設置できない
モデルの制約
Realm0.78
0.77
0.79
0.80
インメモリオブジェクト
executeTransaction メソッド
暗号化機能
PrimaryKey
INSERT or Update (…orUpdate メソッド)
static フィールド Realm モデル
0.01 のアップデートが過激
Realmbyte[] key = new byte[64];
new SecureRandom().nextBytes(key);
Realm realm = Realm.getInstance(/* Context */, key);
英語版のドキュメント = 最新 ≠ 正しい情報
GitHub のサンプル ≠ 正しい情報
ドキュメントは
32 になっている
サンプルは単純な
Random になっている
ドキュメントとサンプルコード
組み合わせ + 検証 + GitHub の changelog / Issues / Pull Request を読む
Realm最後に
Realm
1. Realm は手軽に始められる
2. スタンドアロンアプリに最適
3. 非常に高速に動作する
4. まだ仕様や動作は注意が必要
Realm宣伝
Realm
ChatWork で働きませんか?
1. Android
Realm, RxJava, RxAndroid
2. iOS
ReactiveCocoa, Mantle
3.Web
Scala, spray, DDD, ES6, React.js
下のキーワードにピンときた方、お声がけ or エントリを!

Contenu connexe

Similaire à Android で Realm を使ってみよう

絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方Fumihiko Shiroyama
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目龍一 田中
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
クラスメソッド第4回登壇資料 RxRealm
クラスメソッド第4回登壇資料 RxRealmクラスメソッド第4回登壇資料 RxRealm
クラスメソッド第4回登壇資料 RxRealmDaisuke Nagata
 
東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolateskoichik
 
次世代DaoフレームワークDoma
次世代DaoフレームワークDoma次世代DaoフレームワークDoma
次世代DaoフレームワークDomaToshihiro Nakamura
 
Springでdao 20070413
Springでdao 20070413Springでdao 20070413
Springでdao 20070413Funato Takashi
 
Maiking RIA Apps by Ruby
Maiking RIA Apps by RubyMaiking RIA Apps by Ruby
Maiking RIA Apps by Rubyshozon
 
これからのクラウドネイティブアプリケーションの話をしよう
これからのクラウドネイティブアプリケーションの話をしようこれからのクラウドネイティブアプリケーションの話をしよう
これからのクラウドネイティブアプリケーションの話をしよう真吾 吉田
 
書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所
書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所
書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所Yu Sugawara
 
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Hiroshi Ito
 
Malwat4 20130223 analyzing_android_malware
Malwat4 20130223 analyzing_android_malwareMalwat4 20130223 analyzing_android_malware
Malwat4 20130223 analyzing_android_malwareAyase
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもんMasahito Zembutsu
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 
CDI, Seam 3 and Forge
CDI, Seam 3 and ForgeCDI, Seam 3 and Forge
CDI, Seam 3 and Forgenekop
 
Introduction to extensions and other useful features for developing apps usin...
Introduction to extensions and other useful features for developing apps usin...Introduction to extensions and other useful features for developing apps usin...
Introduction to extensions and other useful features for developing apps usin...Shotaro Suzuki
 
Laravel本とコミュニティの話
Laravel本とコミュニティの話Laravel本とコミュニティの話
Laravel本とコミュニティの話Kazuaki KURIU
 

Similaire à Android で Realm を使ってみよう (20)

絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
クラスメソッド第4回登壇資料 RxRealm
クラスメソッド第4回登壇資料 RxRealmクラスメソッド第4回登壇資料 RxRealm
クラスメソッド第4回登壇資料 RxRealm
 
東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates
 
次世代DaoフレームワークDoma
次世代DaoフレームワークDoma次世代DaoフレームワークDoma
次世代DaoフレームワークDoma
 
Springでdao 20070413
Springでdao 20070413Springでdao 20070413
Springでdao 20070413
 
Maiking RIA Apps by Ruby
Maiking RIA Apps by RubyMaiking RIA Apps by Ruby
Maiking RIA Apps by Ruby
 
G * magazine 0
G * magazine 0G * magazine 0
G * magazine 0
 
Sc2009autumn s2robot
Sc2009autumn s2robotSc2009autumn s2robot
Sc2009autumn s2robot
 
Lt 111217
Lt 111217Lt 111217
Lt 111217
 
これからのクラウドネイティブアプリケーションの話をしよう
これからのクラウドネイティブアプリケーションの話をしようこれからのクラウドネイティブアプリケーションの話をしよう
これからのクラウドネイティブアプリケーションの話をしよう
 
書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所
書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所
書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所
 
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks
 
Malwat4 20130223 analyzing_android_malware
Malwat4 20130223 analyzing_android_malwareMalwat4 20130223 analyzing_android_malware
Malwat4 20130223 analyzing_android_malware
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもん
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 
CDI, Seam 3 and Forge
CDI, Seam 3 and ForgeCDI, Seam 3 and Forge
CDI, Seam 3 and Forge
 
Introduction to extensions and other useful features for developing apps usin...
Introduction to extensions and other useful features for developing apps usin...Introduction to extensions and other useful features for developing apps usin...
Introduction to extensions and other useful features for developing apps usin...
 
Laravel本とコミュニティの話
Laravel本とコミュニティの話Laravel本とコミュニティの話
Laravel本とコミュニティの話
 

Plus de Ryutaro Miyashita

全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-Ryutaro Miyashita
 
Titanium 3.3 / 3.4 と iOS で気をつけたいこと
Titanium 3.3 / 3.4 と iOS で気をつけたいことTitanium 3.3 / 3.4 と iOS で気をつけたいこと
Titanium 3.3 / 3.4 と iOS で気をつけたいことRyutaro Miyashita
 
Titanium ユーザーが Swift を触ってみたら
Titanium ユーザーが Swift を触ってみたらTitanium ユーザーが Swift を触ってみたら
Titanium ユーザーが Swift を触ってみたらRyutaro Miyashita
 
re:Titanium 今ここでもう一度、はじめての Titanium #2
re:Titanium 今ここでもう一度、はじめての Titanium #2re:Titanium 今ここでもう一度、はじめての Titanium #2
re:Titanium 今ここでもう一度、はじめての Titanium #2Ryutaro Miyashita
 
今ここでもう一度初めての Titanium
今ここでもう一度初めての Titanium今ここでもう一度初めての Titanium
今ここでもう一度初めての TitaniumRyutaro Miyashita
 
Titanium Study Meeting in Hamamatsu LT
Titanium Study Meeting in Hamamatsu LTTitanium Study Meeting in Hamamatsu LT
Titanium Study Meeting in Hamamatsu LTRyutaro Miyashita
 
Titanium 2.0 and Sample.Todo
Titanium 2.0 and Sample.TodoTitanium 2.0 and Sample.Todo
Titanium 2.0 and Sample.TodoRyutaro Miyashita
 

Plus de Ryutaro Miyashita (9)

全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-
 
Wearable realm
Wearable realmWearable realm
Wearable realm
 
Titanium 3.3 / 3.4 と iOS で気をつけたいこと
Titanium 3.3 / 3.4 と iOS で気をつけたいことTitanium 3.3 / 3.4 と iOS で気をつけたいこと
Titanium 3.3 / 3.4 と iOS で気をつけたいこと
 
Titanium ユーザーが Swift を触ってみたら
Titanium ユーザーが Swift を触ってみたらTitanium ユーザーが Swift を触ってみたら
Titanium ユーザーが Swift を触ってみたら
 
re:Titanium 今ここでもう一度、はじめての Titanium #2
re:Titanium 今ここでもう一度、はじめての Titanium #2re:Titanium 今ここでもう一度、はじめての Titanium #2
re:Titanium 今ここでもう一度、はじめての Titanium #2
 
今ここでもう一度初めての Titanium
今ここでもう一度初めての Titanium今ここでもう一度初めての Titanium
今ここでもう一度初めての Titanium
 
Titanium Study Meeting in Hamamatsu LT
Titanium Study Meeting in Hamamatsu LTTitanium Study Meeting in Hamamatsu LT
Titanium Study Meeting in Hamamatsu LT
 
Titanium 2.0 and Sample.Todo
Titanium 2.0 and Sample.TodoTitanium 2.0 and Sample.Todo
Titanium 2.0 and Sample.Todo
 
Ti.tokyo.GIG 2012
Ti.tokyo.GIG 2012Ti.tokyo.GIG 2012
Ti.tokyo.GIG 2012
 

Dernier

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 

Dernier (9)

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 

Android で Realm を使ってみよう