Impression of realm java

57
Realm Realm Tech Talk #1, #2 / Realm Meetup #1 Impression of Realm Java / ver.2

Transcript of Impression of realm java

Page 1: Impression of realm java

RealmRealm Tech Talk #1, #2 / Realm Meetup #1Impression of Realm Java / ver.2

Page 2: Impression of realm java

Realm1. ChatWork2. Android and SQLite3. SQLite to Realm4. Realm impression5. Advertise

Page 3: Impression of realm java

Ryutaro MiyashitaMobile Application EngineerChatWork, Android Team

Page 4: Impression of realm java

ビジネス向けのコミュニケーションサービス テキスト, ボイス, ビデオ, タスク, ファイル共有

Page 5: Impression of realm java

導入社数 57,000 を突破 弁護士事務所や工務店など、非 IT 系にも広がる

Page 6: Impression of realm java

ChatWork for Android

2011/06 First Version (Titanium)

2014/04 “Harukas” (Titanium)

2014/12 “The Shard” (Native)

2015/xx Future version (Native)

Page 7: Impression of realm java

“The Shard”会社初のネイティブアプリRealm を使用 (一部)

ChatWork for Android

Page 8: Impression of realm java

Android ⇋ PersistentSharedPreferences か SQLite か

Page 9: Impression of realm java

SharedPrefs SQLite

XML KVSEasy to use

Slow

RDBMSSQL

Hi-Speed

Page 10: Impression of realm java

Select ORMSQLite wrapper library

Page 11: Impression of realm java

greenDAOハイパフォーマンス, 準備が面倒

ActiveAndroidActiveRecord パターン, 分かりやすい

Page 12: Impression of realm java

Select ActiveAndroid簡単に使えることをまずは重視

Page 13: Impression of realm java

@Table(name="rooms") public class Room extend Model { @Column(name="_id", index=true, unique=true) public long _id; @Column(name="name") public String name; }

Define

Page 14: Impression of realm java

Use

Room room = new Room(); room._id = 100l; room.name = "Room name"; room.save();

Page 15: Impression of realm java

MAGICAL BUT INSERT is slow

魔法のようだけど、インサートが遅め

Page 16: Impression of realm java

5,000 rooms 1,000 users

インサートが遅いと辛い

Initialize state……

Page 17: Impression of realm java

I need more SPEED!ボトルネックを解消したい!

Page 18: Impression of realm java

Realma replacement for SQLite & Core Data

@wasabeef_jp さんの記事と出会えて良かったですhttp://qiita.com/wasabeef_jp/items/92bb700e37a0a57fc765

Page 19: Impression of realm java

ActiveAndroid → RealmAA から Realm への置き換えの流れ

Page 20: Impression of realm java

1. AA Model → Realm BeanAA Model から Realm 指定の Bean に

http://ja.wikipedia.org/wiki/ネジレフサマメノキ#mediaviewer/File:Parkia_speciosa.JPG

Page 21: Impression of realm java

AA

@Table(name="rooms") public class Room extend Model { @Column(name="_id", index=true, unique=true) public long _id; @Column(name="name") public String name; }

Page 22: Impression of realm java

public class Room extend RealmObject { @PrimaryKey private long roomId; private String name;

public void setRoomId(long roomId) { this.roomId = roomId; } public long getRoomId() { return this.roomId; }

// name も同様に getter / setter を準備 }

Realm

Page 23: Impression of realm java

AA

Room room = new Room(); room._id = 100l; room.name = "Room name"; room.save();

Page 24: Impression of realm java

Realm realm = Realm.getInstance(CONTEXT_OBJECT); realm.beginTransaction(); Room room = realm.createObject(Room.class); room.setRoomId(100l); room.setName("Room name"); realm.commitTransaction();

Realm

Page 25: Impression of realm java

2. Logic → Service LayerRealmObject にはロジックを置けない

http://ja.wikipedia.org/wiki/海老名サービスエリア#mediaviewer/File:Ebina-SA-Nobori.JPG

Page 26: Impression of realm java

@Table(name="rooms") public class Room extend Model { @Column(name="name") public String name; …… public void sendChat(String message) { // Send chat logic } }

// room.sendChat("Your message");

AA

Page 27: Impression of realm java

Realm

public class RoomService {  …… public static void sendChat(long roomId, String message) { // Send chat logic } }

// RoomService.sendChat(100, "Your message");

Page 28: Impression of realm java

3. Thread をまたがないRealm X は Thread ごとに参照する

http://upload.wikimedia.org/wikipedia/commons/2/21/Naisten_400_m_aidat.jpg

Page 29: Impression of realm java

long roomId = 100; Room room = new Select().from(Room.class) .where("_id = ?", roomId) .executeSingle(); …… new Thread(() -> { // RetroLambda // room を使った何か }).start();

AA

Page 30: Impression of realm java

Realm

final long roomId = 100; Realm realm = Realm.getInstance(CONTEXT_OBJECT); Room room = realm.where("id", roomId).findFirst(); …… new Thread(() -> { Realm realm = Realm.getInstance(CONTEXT_OBJECT); Room room = realm.where("id", roomId).findFirst(); …… }).start();

Page 31: Impression of realm java

4. Realm を close する使い終わったらお片付け!

http://upload.wikimedia.org/wikipedia/commons/b/b6/A_Photograph_of_an_Original_Door_from_the_Bolduc_House_in_Ste_Genevieve_MO.png

Page 32: Impression of realm java

new Thread(() -> { Realm realm = Realm.getInstance(CONTEXT_OBJECT); try { Room room = realm.where("id", roomId).findFirst(); …… } finally { if (realm != null) realm.close(); } }).start();

Realm

Page 33: Impression of realm java

Realm impression何が良くて, 何に気をつけたいか

Page 34: Impression of realm java

Awesome良いと思ったところ

Page 35: Impression of realm java

1. Fast納得いくスピード

http://upload.wikimedia.org/wikipedia/commons/f/f0/Ferrari_Formula_1_lineup_at_the_N%C3%BCrburgring.jpg

Page 36: Impression of realm java

“RealmCW”ChatWork API を使用LogCat に処理時間を出力

Realm を使ったデモアプリ

Page 37: Impression of realm java

初期化時間

[ms]

0

400

800

1200

1600

ActiveAndroid Realm

Nexus 4 / Android 5.0.1https://api.chatwork.com/v1/rooms INSERT 件数 619 件

1551

414

Page 38: Impression of realm java

2. Fluent API流れるように使える API

http://commons.wikimedia.org/wiki/File:%E5%B2%B7%E5%8E%BF%E6%B4%AE%E6%B2%B3%E6%B9%BF%E5%9C%B0.jpg

Page 39: Impression of realm java

RealmResults<Room> results = realm.where(Room.class) .contains( "name", // 検索カラム "YOUR SEARCH TERM", // 検索語 RealmQuery.CASE_INSENSITIVE // 大文字小文字区別なし ) .findAllSorted( "sticky", false, // ソート1, 降順 "lastUpdateTime", false // ソート2, 降順 );

Realm

Page 40: Impression of realm java

3. New choiceSharedPreferences, SQLite に次ぐ選択肢

http://upload.wikimedia.org/wikipedia/commons/7/7e/BalanceMineralPachuca.JPG

Page 41: Impression of realm java

iOS Android

Object archiveProperty list

NSUserDefaultsCore Data

* SQLite base / Raw SQL = FMDB

SharedPreferencesSQLite

* Plain SQL, Content Provider

Realm+

Page 42: Impression of realm java

Be careful気をつけたいところ

Page 43: Impression of realm java

1. Multi-thread environmentマルチスレッドでの取り扱い

http://upload.wikimedia.org/wikipedia/commons/a/a7/Colourful_thread_in_Chinatowns_market_streets_%286491930649%29.jpg

Page 44: Impression of realm java

2. Drastic update0.01 のアップデートも要注意!

http://upload.wikimedia.org/wikipedia/commons/1/10/Various_cutter_knives.jpg

Page 45: Impression of realm java

0.771. In-memory Standalone Object 2. “executeTransaction” method

// Realm.createObject(MyRealmObj.class) MyRealmObj obj = new MyRealmObj(); …… realm.executeTransaction(_realm -> { _realm.copyToRealm(obj); });

2015/1/16

Page 46: Impression of realm java

0.781. Enable encryption

byte[] key = new byte[64]; new Random(365762536).nextBytes(key); // Encrypt realm Realm realm = Realm.getInstance(CONTEXT, key);

2015/1/22

Page 47: Impression of realm java

0.791. Primary key 2. Insert or Update = Replace

public class MyRealmObj extends RealmObject { @PrimaryKey private long id; }

realm.copyToRealmOrUpdate(REALM_OBJECT);

2015/2/16

Page 48: Impression of realm java

3. Read the docs!迷ったら 英語の ドキュメントを読もう!

http://ja.wikipedia.org/wiki/%E6%9C%AC#mediaviewer/File:Livre_Ouvert.jpg

Page 49: Impression of realm java

0.79 0.72

Page 50: Impression of realm java

!4. Read the GitHub!“changelog” ファイルを読もう!

Page 51: Impression of realm java

まだリリースされていない

Page 52: Impression of realm java

Conclusion結び

Page 53: Impression of realm java

高速, 綺麗な API / 継続的なウォッチ必須Realm

My recommendationUltra Fast Searchable Cache

Page 54: Impression of realm java

Demo appshttps://github.com/ryugoo/RealmCW

http://qiita.com/ryugoo/items/b2dea8ad4a24fdd620b6My Qiita article

Page 55: Impression of realm java

Advertise宣伝

Page 56: Impression of realm java

エンジニア "大" 募集中です

Web apps engineerReactiveCocoa, MantleiOS apps engineer

Realm, RxJava, RxAndroidAndroid apps engineer

Scala, spray, DDD✎ ✎

Page 57: Impression of realm java

Thank youおしまい :)