狠狠撸

狠狠撸Share a Scribd company logo
RealmRealm Tech Talk #1, #2 / Realm Meetup #1
Impression of Realm Java / ver.2
Realm
1. ChatWork
2. Android and SQLite
3. SQLite to Realm
4. Realm impression
5. Advertise
Ryutaro Miyashita
Mobile Application Engineer
ChatWork, 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 Persistent
SharedPreferences か SQLite か
SharedPrefs SQLite
XML KVS
Easy to use
Slow
RDBMS
SQL
Hi-Speed
Select ORM
SQLite wrapper library
greenDAO
ハイパフォーマンス, 準備が面倒
ActiveAndroid
ActiveRecord パターン, 分かりやすい
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;
}
De?ne
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 蝉迟补迟别……
I need more SPEED!
ボトルネックを解消したい!
Realm
a replacement for SQLite & Core Data
@wasabeef_jp さんの記事と出会えて良かったです?
http://qiita.com/wasabeef_jp/items/92bb700e37a0a57fc765
ActiveAndroid → Realm
AA から Realm への置き換えの流れ
1. AA Model → Realm Bean
AA 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 Layer
RealmObject にはロジックを置けない
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.1
https://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 choice
SharedPreferences, SQLite に次ぐ選択肢
http://upload.wikimedia.org/wikipedia/commons/7/7e/BalanceMineralPachuca.JPG
iOS Android
Object archive
Property list
NSUserDefaults
Core Data
* SQLite base / Raw SQL = FMDB
SharedPreferences
SQLite
* 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 update
0.01 のアップデートも要注意!
http://upload.wikimedia.org/wikipedia/commons/1/10/Various_cutter_knives.jpg
0.77
1. 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.78
1. Enable encryption
byte[] key = new byte[64];
new Random(365762536).nextBytes(key);
// Encrypt realm
Realm realm = Realm.getInstance(CONTEXT, key);
2015/1/22
0.79
1. 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 recommendation
Ultra Fast Searchable Cache
Demo apps
https://github.com/ryugoo/RealmCW
http://qiita.com/ryugoo/items/b2dea8ad4a24fdd620b6
My Qiita article
Advertise
宣伝
エンジニア "大" 募集中です
Web apps engineer
ReactiveCocoa, Mantle
iOS apps engineer
Realm, RxJava, RxAndroid
Android apps engineer
Scala, spray, DDD? ?
?
Thank you
おしまい :)

More Related Content

Impression of realm java