Impression of realm java
-
Upload
ryutaro-miyashita -
Category
Technology
-
view
2.140 -
download
2
Transcript of Impression of realm java
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おしまい :)