impression of realm java

Post on 14-Jul-2015

2.140 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

Ryutaro MiyashitaMobile Application EngineerChatWork, Android Team

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

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

ChatWork for Android

2011/06 First Version (Titanium)

2014/04 “Harukas” (Titanium)

2014/12 “The Shard” (Native)

2015/xx Future version (Native)

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

ChatWork for Android

Android ⇋ PersistentSharedPreferences か SQLite か

SharedPrefs SQLite

XML KVSEasy to use

Slow

RDBMSSQL

Hi-Speed

Select ORMSQLite wrapper library

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

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

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

@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

Use

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

MAGICAL BUT INSERT is slow

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

5,000 rooms 1,000 users

インサートが遅いと辛い

Initialize state……

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

Realma replacement for SQLite & Core Data

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

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

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

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

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; }

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

AA

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

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

Realm

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

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

@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

Realm

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

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

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

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

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

AA

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();

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

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

Realm

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

Awesome良いと思ったところ

1. Fast納得いくスピード

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

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

Realm を使ったデモアプリ

初期化時間

[ms]

0

400

800

1200

1600

ActiveAndroid Realm

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

1551

414

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

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

Realm

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

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

iOS Android

Object archiveProperty list

NSUserDefaultsCore Data

* SQLite base / Raw SQL = FMDB

SharedPreferencesSQLite

* Plain SQL, Content Provider

Realm+

Be careful気をつけたいところ

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

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

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

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

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

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

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

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

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

0.79 0.72

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

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

Conclusion結び

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

My recommendationUltra Fast Searchable Cache

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

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

Advertise宣伝

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

Web apps engineerReactiveCocoa, MantleiOS apps engineer

Realm, RxJava, RxAndroidAndroid apps engineer

Scala, spray, DDD✎ ✎

Thank youおしまい :)

top related