Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.
RealmAndroid で
Realm を使ってみよう
Introduction to Realm for Android
Application Development Division
Android Team, Ryutaro Miya...
RealmRyutaro Miyashita
Mobile Application Engineer / ChatWork
DroidKaigi は落ちました
Realm
ChatWork とは
ビジネス向けのチャットツールです
導入社数 60,000 を突破
多職種が入り交じる大きな企業や、非 IT 系の中小企業を中心に導入
利用技術はアグレッシブ
Realm をはじめとして、Scala や周辺 S...
Realm
Realm
1. NoSQL 型の DB + ORM
2. C++ 製の Realm-Core
3. iOS /Android 両対応
4. とても速い!
RealmRealm を使ってみよう
Realm使い始めるのは簡単
Realm
build.gradle に記述して Sync する
dependencies {
compile 'io.realm:realm-android:0.80.0'
}
Realm
モデルを書く = テーブル定義を書く
public class User extends RealmObject {
@PrimaryKey
private long id;
@Index
private String name;
...
Realm
Realm realm = Realm.getInstance(/* Context */);
// Retrolambda
realm.executeTransaction(_realm -> {
User user = _rea...
Realm
Realm realm = Realm.getInstance(/* Context */);
User user = realm.where(User.class)
.equalTo("id", 1)
.findFirst();
...
Realm他の永続化機構との比較
Realm
Realm SQLiteShared
Preferences
簡単
XML KVS
遅い
面倒
RDBMS
速い
簡単
NoSQL RDB
速い
いいとこ取り:)
Realm
Realm ActiveAndroid
ORM (SQLite)
ActiveRecord
遅い
簡単
NoSQL RDB
速い
いいとこ取り:)
Realm
初期化時間[ms]
0
4000
8000
12000
16000
Realm ActiveAndroid
15,544 ms
5,054 ms
Insert 件数 10,000 件
Nexus 4 / Android 5.0.1
...
Realm実際に Realm を使うなら
Realm暗号化
Realmbyte[] key = new byte[64];
new SecureRandom().nextBytes(key);
Realm realm = Realm.getInstance(/* Context */, key);
by...
Realm
初期化時間[ms]
0
4000
8000
12000
16000
Realm ActiveAndroid
15,544 ms
5,054 ms
Insert 件数 10,000 件
Nexus 4 / Android 5.0.1
...
Realmbyte[] key = new byte[64];
new SecureRandom().nextBytes(key);
Realm realm = Realm.getInstance(/* Context */, key);
ドキ...
Realm
Key を作ったらファイルにして保存する
Key ファイルがあれば読み出して byte 配列に格納する
byte[] key;
File keyFile = context.getFileStreamPath(FILE_NAME);...
RealmRealm オブジェクト
Realm
Realm realm;
try {
realm = Realm.getInstance(/* Context */, key);
} finally {
if (realm != null) realm.close();
}
Re...
Realmtry (Realm realm = Realm.getInstance(/* Context */, key)) {
// do something
}
Android 4.4 以上であれば try-with-resources が...
Realm
public class MainActivity extends ActionBarActivity {
private Realm mRealm;
@Override
protected void onCreate(Bundle...
Realmマルチスレッド
Realm
Realm realm = Realm.getInstance(/* Context */, key);
User user = realm.where(User.class)
.equalTo("id", 1)
.findFirs...
Realm
// Retrolambda
new Thread(() -> {
Realm realm = Realm.getInstance(/* Context */, key);
User user = realm.where(User....
Realm注意したいところ
Realm
public class User extends RealmObject {
@PrimaryKey
private long id;
@Index
private String name;
// Getter と Setter ...
Realm0.78
0.77
0.79
0.80
インメモリオブジェクト
executeTransaction メソッド
暗号化機能
PrimaryKey
INSERT or Update (…orUpdate メソッド)
static フィー...
Realmbyte[] key = new byte[64];
new SecureRandom().nextBytes(key);
Realm realm = Realm.getInstance(/* Context */, key);
英語...
Realm最後に
Realm
1. Realm は手軽に始められる
2. スタンドアロンアプリに最適
3. 非常に高速に動作する
4. まだ仕様や動作は注意が必要
Realm宣伝
Realm
ChatWork で働きませんか?
1. Android
Realm, RxJava, RxAndroid
2. iOS
ReactiveCocoa, Mantle
3.Web
Scala, spray, DDD, ES6, Rea...
Próxima SlideShare
Cargando en…5
×

Android で Realm を使ってみよう

6.846 visualizaciones

Publicado el

Presentation of 03.14.2015 Realm meetup #1 in Sansan.
Get started Realm-Java.

Publicado en: Tecnología
  • DOWNLOAD FULL MOVIE, INTO AVAILABLE FORMAT ......................................................................................................................... ......................................................................................................................... ,DOWNLOAD FULL. MOVIE 4K,FHD,HD,480P here { https://tinyurl.com/yybdfxwh }
       Responder 
    ¿Estás seguro?    No
    Tu mensaje aparecerá aquí
  • DOWNLOAD FULL MOVIE, INTO AVAILABLE FORMAT ......................................................................................................................... ......................................................................................................................... ,DOWNLOAD FULL. MOVIE 4K,FHD,HD,480P here { https://tinyurl.com/yybdfxwh }
       Responder 
    ¿Estás seguro?    No
    Tu mensaje aparecerá aquí

Android で Realm を使ってみよう

  1. 1. RealmAndroid で Realm を使ってみよう Introduction to Realm for Android Application Development Division Android Team, Ryutaro Miyashita 2015.03.14
  2. 2. RealmRyutaro Miyashita Mobile Application Engineer / ChatWork DroidKaigi は落ちました
  3. 3. Realm ChatWork とは ビジネス向けのチャットツールです 導入社数 60,000 を突破 多職種が入り交じる大きな企業や、非 IT 系の中小企業を中心に導入 利用技術はアグレッシブ Realm をはじめとして、Scala や周辺 SaaS, AWS などをフル活用
  4. 4. Realm
  5. 5. Realm 1. NoSQL 型の DB + ORM 2. C++ 製の Realm-Core 3. iOS /Android 両対応 4. とても速い!
  6. 6. RealmRealm を使ってみよう
  7. 7. Realm使い始めるのは簡単
  8. 8. Realm build.gradle に記述して Sync する dependencies { compile 'io.realm:realm-android:0.80.0' }
  9. 9. Realm モデルを書く = テーブル定義を書く public class User extends RealmObject { @PrimaryKey private long id; @Index private String name; // Getter と Setter は省略 }
  10. 10. Realm Realm realm = Realm.getInstance(/* Context */); // Retrolambda realm.executeTransaction(_realm -> { User user = _realm.createObject(User.class); user.setId(1); user.setName("John Doe"); }); realm.close(); トランザクションの中でオブジェクトを作る
  11. 11. Realm Realm realm = Realm.getInstance(/* Context */); User user = realm.where(User.class) .equalTo("id", 1) .findFirst(); realm.close(); メソッドチェインでクエリを作ってオブジェクトを取り出す iOS 版では NSPredicate like な検索だが、Android ではクエリビルダ
  12. 12. Realm他の永続化機構との比較
  13. 13. Realm Realm SQLiteShared Preferences 簡単 XML KVS 遅い 面倒 RDBMS 速い 簡単 NoSQL RDB 速い いいとこ取り:)
  14. 14. Realm Realm ActiveAndroid ORM (SQLite) ActiveRecord 遅い 簡単 NoSQL RDB 速い いいとこ取り:)
  15. 15. Realm 初期化時間[ms] 0 4000 8000 12000 16000 Realm ActiveAndroid 15,544 ms 5,054 ms Insert 件数 10,000 件 Nexus 4 / Android 5.0.1 JSON → Object
  16. 16. Realm実際に Realm を使うなら
  17. 17. Realm暗号化
  18. 18. Realmbyte[] key = new byte[64]; new SecureRandom().nextBytes(key); Realm realm = Realm.getInstance(/* Context */, key); byte 型の配列を長さ 64 で作る SecureRandom#nextBytes を使って乱数バイトを取り出す 暗号化を使っても速度にそこまで影響しない!
  19. 19. Realm 初期化時間[ms] 0 4000 8000 12000 16000 Realm ActiveAndroid 15,544 ms 5,054 ms Insert 件数 10,000 件 Nexus 4 / Android 5.0.1 JSON → Object ↓ 暗号化を使った結果
  20. 20. Realmbyte[] key = new byte[64]; new SecureRandom().nextBytes(key); Realm realm = Realm.getInstance(/* Context */, key); ドキュメントとサンプルの情報の整合性が取れていない Key の保存方法は提示されていない ドキュメントは 32 になっている サンプルは単純な Random になっている どこかに保存したい
  21. 21. Realm Key を作ったらファイルにして保存する Key ファイルがあれば読み出して byte 配列に格納する byte[] key; File keyFile = context.getFileStreamPath(FILE_NAME); if (keyFile.exists()) { key = Files.readFromFile(keyFile, 64); } else { key = new byte[64]; new SecureRandom().nextBytes(key); Files.byteToFile(context, key, FILE_NAME); } http://goo.gl/GIK2qXFiles →
  22. 22. RealmRealm オブジェクト
  23. 23. Realm Realm realm; try { realm = Realm.getInstance(/* Context */, key); } finally { if (realm != null) realm.close(); } Realm を操作するときは Realm#getInstance を経由する Realm オブジェクトは使い終わったら close が必要である
  24. 24. Realmtry (Realm realm = Realm.getInstance(/* Context */, key)) { // do something } Android 4.4 以上であれば try-with-resources が使える でも、4.4 以上をターゲットにできるのは多分、来世
  25. 25. Realm public class MainActivity extends ActionBarActivity { private Realm mRealm; @Override protected void onCreate(Bundle savedInstanceState) { mRealm = Realm.getInstance(getApplicationContext()); } @Override protected void onDestroy() { super.onDestroy(); if (mRealm != null) mRealm.close(); } } Activity の中であれば、インスタンス変数として保持してしまう onResume のタイミングで null チェックすると良いかも onDestroy のタイミングで close する
  26. 26. Realmマルチスレッド
  27. 27. Realm Realm realm = Realm.getInstance(/* Context */, key); User user = realm.where(User.class) .equalTo("id", 1) .findFirst(); // Retrolambda new Thread(() -> { Log.d(TAG, user.getName()); }).start(); realm.close(); 一見動きそうではある
  28. 28. Realm // Retrolambda new Thread(() -> { Realm realm = Realm.getInstance(/* Context */, key); User user = realm.where(User.class) .equalTo("id", 1) .findFirst(); Log.d(TAG, user.getName()); realm.close(); }).start(); Thread の中で Realm オブジェクトそのものから取得し直す必要がある Realm オブジェクトの close 忘れに要注意
  29. 29. Realm注意したいところ
  30. 30. Realm public class User extends RealmObject { @PrimaryKey private long id; @Index private String name; // Getter と Setter は省略 } モデルのフィールドに使える型は制約がある (詳細リンク) 全てのフィールドは private かつ、Getter / Setter が必要である equals, hashCode, toString も含めて、メソッドを設置できない モデルの制約
  31. 31. Realm0.78 0.77 0.79 0.80 インメモリオブジェクト executeTransaction メソッド 暗号化機能 PrimaryKey INSERT or Update (…orUpdate メソッド) static フィールド Realm モデル 0.01 のアップデートが過激
  32. 32. Realmbyte[] key = new byte[64]; new SecureRandom().nextBytes(key); Realm realm = Realm.getInstance(/* Context */, key); 英語版のドキュメント = 最新 ≠ 正しい情報 GitHub のサンプル ≠ 正しい情報 ドキュメントは 32 になっている サンプルは単純な Random になっている ドキュメントとサンプルコード 組み合わせ + 検証 + GitHub の changelog / Issues / Pull Request を読む
  33. 33. Realm最後に
  34. 34. Realm 1. Realm は手軽に始められる 2. スタンドアロンアプリに最適 3. 非常に高速に動作する 4. まだ仕様や動作は注意が必要
  35. 35. Realm宣伝
  36. 36. Realm ChatWork で働きませんか? 1. Android Realm, RxJava, RxAndroid 2. iOS ReactiveCocoa, Mantle 3.Web Scala, spray, DDD, ES6, React.js 下のキーワードにピンときた方、お声がけ or エントリを!

×