Your SlideShare is downloading. ×
Impression of realm java
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Impression of realm java

0
views

Published on

Presentation for Realm Tech Talk #1, #2

Presentation for Realm Tech Talk #1, #2

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
0
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. RealmRealm Tech Talk #1, #2 / Realm Meetup #1 Impression of Realm Java / ver.2
  • 2. Realm 1. ChatWork 2. Android and SQLite 3. SQLite to Realm 4. Realm impression 5. Advertise
  • 3. Ryutaro Miyashita Mobile Application Engineer ChatWork, Android Team
  • 4. ビジネス向けのコミュニケーションサービス テキスト, ボイス, ビデオ, タスク, ファイル共有
  • 5. 導入社数 57,000 を突破 弁護士事務所や工務店など、非 IT 系にも広がる
  • 6. ChatWork for Android 2011/06 First Version (Titanium) 2014/04 “Harukas” (Titanium) 2014/12 “The Shard” (Native) 2015/xx Future version (Native)
  • 7. “The Shard” 会社初のネイティブアプリ Realm を使用 (一部) ChatWork for Android
  • 8. Android Persistent SharedPreferences か SQLite か
  • 9. SharedPrefs SQLite XML KVS Easy to use Slow RDBMS SQL Hi-Speed
  • 10. Select ORM SQLite wrapper library
  • 11. greenDAO ハイパフォーマンス, 準備が面倒 ActiveAndroid ActiveRecord パターン, 分かりやすい
  • 12. Select ActiveAndroid 簡単に使えることをまずは重視
  • 13. @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
  • 14. Use Room room = new Room(); room._id = 100l; room.name = "Room name"; room.save();
  • 15. MAGICAL BUT INSERT is slow 魔法のようだけど、インサートが遅め
  • 16. 5,000 rooms 1,000 users インサートが遅いと辛い Initialize state……
  • 17. I need more SPEED! ボトルネックを解消したい!
  • 18. Realm a replacement for SQLite & Core Data @wasabeef_jp さんの記事と出会えて良かったです
 http://qiita.com/wasabeef_jp/items/92bb700e37a0a57fc765
  • 19. ActiveAndroid → Realm AA から Realm への置き換えの流れ
  • 20. 1. AA Model → Realm Bean AA Model から Realm 指定の Bean に http://ja.wikipedia.org/wiki/ネジレフサマメノキ#mediaviewer/File:Parkia_speciosa.JPG
  • 21. 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; }
  • 22. 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
  • 23. AA Room room = new Room(); room._id = 100l; room.name = "Room name"; room.save();
  • 24. Realm realm = Realm.getInstance(CONTEXT_OBJECT); realm.beginTransaction(); Room room = realm.createObject(Room.class); room.setRoomId(100l); room.setName("Room name"); realm.commitTransaction(); Realm
  • 25. 2. Logic → Service Layer RealmObject にはロジックを置けない http://ja.wikipedia.org/wiki/海老名サービスエリア#mediaviewer/File:Ebina-SA-Nobori.JPG
  • 26. @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
  • 27. Realm public class RoomService {  …… public static void sendChat(long roomId, String message) { // Send chat logic } } // RoomService.sendChat(100, "Your message");
  • 28. 3. Thread をまたがない Realm X は Thread ごとに参照する http://upload.wikimedia.org/wikipedia/commons/2/21/Naisten_400_m_aidat.jpg
  • 29. long roomId = 100; Room room = new Select().from(Room.class) .where("_id = ?", roomId) .executeSingle(); …… new Thread(() -> { // RetroLambda // room を使った何か }).start(); AA
  • 30. 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();
  • 31. 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
  • 32. new Thread(() -> { Realm realm = Realm.getInstance(CONTEXT_OBJECT); try { Room room = realm.where("id", roomId).findFirst(); …… } finally { if (realm != null) realm.close(); } }).start(); Realm
  • 33. Realm impression 何が良くて, 何に気をつけたいか
  • 34. Awesome 良いと思ったところ
  • 35. 1. Fast 納得いくスピード http://upload.wikimedia.org/wikipedia/commons/f/f0/Ferrari_Formula_1_lineup_at_the_N%C3%BCrburgring.jpg
  • 36. “RealmCW” ChatWork API を使用 LogCat に処理時間を出力 Realm を使ったデモアプリ
  • 37. 初期化時間[ms] 0 400 800 1200 1600 ActiveAndroid Realm Nexus 4 / Android 5.0.1 https://api.chatwork.com/v1/rooms INSERT 件数 619 件 1551 414
  • 38. 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
  • 39. RealmResults<Room> results = realm.where(Room.class) .contains( "name", // 検索カラム "YOUR SEARCH TERM", // 検索語 RealmQuery.CASE_INSENSITIVE // 大文字小文字区別なし ) .findAllSorted( "sticky", false, // ソート1, 降順 "lastUpdateTime", false // ソート2, 降順 ); Realm
  • 40. 3. New choice SharedPreferences, SQLite に次ぐ選択肢 http://upload.wikimedia.org/wikipedia/commons/7/7e/BalanceMineralPachuca.JPG
  • 41. iOS Android Object archive Property list NSUserDefaults Core Data * SQLite base / Raw SQL = FMDB SharedPreferences SQLite * Plain SQL, Content Provider Realm +
  • 42. Be careful 気をつけたいところ
  • 43. 1. Multi-thread environment マルチスレッドでの取り扱い http://upload.wikimedia.org/wikipedia/commons/a/a7/Colourful_thread_in_Chinatowns_market_streets_%286491930649%29.jpg
  • 44. 2. Drastic update 0.01 のアップデートも要注意! http://upload.wikimedia.org/wikipedia/commons/1/10/Various_cutter_knives.jpg
  • 45. 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
  • 46. 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
  • 47. 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
  • 48. 3. Read the docs! 迷ったら 英語の ドキュメントを読もう! http://ja.wikipedia.org/wiki/%E6%9C%AC#mediaviewer/File:Livre_Ouvert.jpg
  • 49. 0.79 0.72
  • 50. 4. Read the GitHub! “changelog” ファイルを読もう!
  • 51. まだリリースされていない
  • 52. Conclusion 結び
  • 53. 高速, 綺麗な API / 継続的なウォッチ必須 Realm My recommendation Ultra Fast Searchable Cache
  • 54. Demo apps https://github.com/ryugoo/RealmCW http://qiita.com/ryugoo/items/b2dea8ad4a24fdd620b6 My Qiita article
  • 55. Advertise 宣伝
  • 56. エンジニア "大" 募集中です Web apps engineer ReactiveCocoa, Mantle iOS apps engineer Realm, RxJava, RxAndroid Android apps engineer Scala, spray, DDD✎ ✎ ✎
  • 57. Thank you おしまい :)