Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Realm Japan meetup Ueda

Avatar for zaki50 zaki50
November 12, 2016

Realm Japan meetup Ueda

Avatar for zaki50

zaki50

November 12, 2016
Tweet

More Decks by zaki50

Other Decks in Technology

Transcript

  1. Realm ˖ ؙٗأفٓحزؿؓ٦ي ˖ J04"OESPJE ˖ +BWB 4XJGU 0CKFDUJWF$ $

    +BWB4DSJQU ˖ ؔ٦فٝا٦أ ˖ 杝荈%#ؒٝآٝ42-JUF׾⢪׏גְזְ zaki@realm.io
  2. public class Article extends RealmObject { @PrimaryKey private int id;

    @Required private String title; private String contents; private Date creationDate; private Date modificationDate; private User user; private RealmList<Comment> comments; // getter, setter } Ϟσϧʢςʔϒϧʣఆٛ zaki@realm.io
  3. class Article: Object { dynamic var id: Int = 0

    dynamic var title: String = "" dynamic var contents: String = "" dynamic var creationDate: NSDate = NSDate() dynamic var modificationDate: NSDate = NSDate() dynamic var user: User? = nil let comments = List<Comment>() } Ϟσϧʢςʔϒϧʣఆٛ (iOS) zaki@realm.io
  4. public class Article extends RealmObject { @PrimaryKey private int id;

    @Required private String title; private String contents; private Date creationDate; private Date modificationDate; private User user; private RealmList<Comment> comments; // getter, setter } Ϟσϧʢςʔϒϧʣఆٛ RealmObjectΫϥεΛܧঝ zaki@realm.io
  5. public class Article extends RealmObject { @PrimaryKey private int id;

    @Required private String title; private String contents; private Date creationDate; private Date modificationDate; private User user; private RealmList<Comment> comments; // getter, setter } Ϟσϧʢςʔϒϧʣఆٛ ΧϥϜͱσʔλܕ zaki@realm.io
  6. public class Article extends RealmObject { @PrimaryKey private int id;

    @Required private String title; private String contents; private Date creationDate; private Date modificationDate; private User user; private RealmList<Comment> comments; // getter, setter } Ϟσϧʢςʔϒϧʣఆٛ nullͷՄʗෆՄ zaki@realm.io
  7. public class Article extends RealmObject { @PrimaryKey private int id;

    @Required private String title; private String contents; private Date creationDate; private Date modificationDate; private User user; private RealmList<Comment> comments; // getter, setter } Ϟσϧʢςʔϒϧʣఆٛ ̍ର̍ͷؔ࿈ zaki@realm.io
  8. public class Article extends RealmObject { @PrimaryKey private int id;

    @Required private String title; private String contents; private Date creationDate; private Date modificationDate; private User user; private RealmList<Comment> comments; // getter, setter } Ϟσϧʢςʔϒϧʣఆٛ ̍ରଟͷؔ࿈ zaki@realm.io
  9. byte/Byte short/Short int/Integer long/Long boolean/Boolean float/Float double/Double String Date byte[]

    モデルクラス RealmList<モデルクラス> Ϟσϧʢςʔϒϧʣఆٛ ΧϥϜʹ࢖༻Ͱ͖Δܕ zaki@realm.io
  10. Article article = new Article(); article.setId(1);
 article.setTitle("Realm meetup");
 
 Realm

    realm = Realm.getDefaultInstance();
 try {
 realm.executeTransaction(realm -> { realm.insert(article);
 });
 } finally {
 realm.close();
 } σʔλͷอଘ zaki@realm.io
  11. Article article = new Article(); article.setId(1);
 article.setTitle("Realm meetup");
 
 Realm

    realm = Realm.getDefaultInstance();
 try {
 realm.executeTransaction(realm -> { realm.insert(person);
 });
 } finally {
 realm.close();
 } σʔλͷอଘ ϞσϧΦϒδΣΫτͷ࡞੒ zaki@realm.io
  12. Article article = new Article(); article.setId(1);
 article.setTitle("Realm meetup");
 
 Realm

    realm = Realm.getDefaultInstance();
 try {
 realm.executeTransaction(realm -> { realm.insert(person);
 });
 } finally {
 realm.close();
 } σʔλͷอଘ RealmΠϯελϯεͷऔಘ zaki@realm.io
  13. Article article = new Article(); article.setId(1);
 article.setTitle("Realm meetup");
 
 Realm

    realm = Realm.getDefaultInstance();
 try {
 realm.executeTransaction(realm -> { realm.insert(person);
 });
 } finally {
 realm.close();
 } σʔλͷอଘ ςʔϒϧ΁ૠೖ zaki@realm.io
  14. Realm realm = Realm.getDefaultInstance();
 try { RealmResults<Article> articles = realm.where(Article.class)

    .beginsWith("title", "Realm") .findAllSorted("creationDate", Sort.DESCENDING); } finally {
 realm.close();
 } ΫΤϦ zaki@realm.io
  15. Realm realm = Realm.getDefaultInstance();
 try { RealmResults<Article> articles = realm.where(Article.class)

    .beginsWith("title", "Realm") .findAllSorted("creationDate", Sort.DESCENDING); } finally {
 realm.close();
 } ΫΤϦ RealmΠϯελϯεͷऔಘ zaki@realm.io
  16. Realm realm = Realm.getDefaultInstance();
 try { RealmResults<Article> articles = realm.where(Article.class)

    .beginsWith("title", "Realm") .findAllSorted("creationDate", Sort.DESCENDING); } finally {
 realm.close();
 } ΫΤϦ ৚݅ͷࢦఆͱ݁Ռͷऔಘ zaki@realm.io
  17. Realm realm = Realm.getDefaultInstance();
 try { RealmResults<Article> articles = realm.where(Article.class)

    .equalTo("user.name", "Tim") .lessThan("user.age", 30) .findAllSorted("creationDate", Sort.DESCENDING); } finally {
 realm.close();
 } ϦϯΫΫΤϦ zaki@realm.io
  18. Realm realm = Realm.getDefaultInstance();
 try { RealmResults<Article> articles = realm.where(Article.class)

    .contains("comments.message", "Ueda") .contains("comments.message", "meetup") .findAllSorted("creationDate", Sort.DESCENDING); } finally {
 realm.close();
 } ϦϯΫΫΤϦ ஫ҙʂ zaki@realm.io
  19. Realm realm = Realm.getDefaultInstance();
 try {
 RealmResults<Article> articles = ...;

    Article article = articles.first(); article.isManaged(); // true Log.d("realm", article.getTitle()); Log.d("realm", article.getUser().getName()); Log.d("realm", article.getComments().get(0).getMessage()); } finally {
 realm.close();
 } σʔλͷಡΈग़͠ zaki@realm.io
  20. RealmResults<Article> articles = ...; articles.addChangeListener(results -> { // ArticleΫϥεʹ͍ͭͯมߋɾ௥Ճɾ࡟আͷࡍʹݺ͹ΕΔ });

    Article article = articles.first(); article.addChangeListener(obj -> { // ArticleΫϥεʹ͍ͭͯมߋɾ௥Ճɾ࡟আͷࡍʹݺ͹ΕΔ }); มߋ௨஌ zaki@realm.io
  21. ࣮ࡍͷ࢖͍ํ Activityฤ public class ArticleActivity extends AppCompatActivity {
 private Realm

    realm;
 private Article article;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_article);
 int id = getIntent().getIntExtra("id", 0);
 realm = Realm.getDefaultInstance(); article = realm.where(Article.class).equalTo("id", id);
 } @Override
 public void onDestroy() {
 super.onDestroy(); realm.close(); } } zaki@realm.io
  22. ࣮ࡍͷ࢖͍ํ Fragmentฤ public class ArticleFragment extends Fragment {
 private Realm

    realm;
 private Article article;
 @Override
 public View onCreateView(...) { super.onCreateView(...); realm = Realm.getDefaultInstance(); int id = getIntent().getIntExtra("id", 0);
 article = realm.where(Article.class).equalTo("id", id); // Viewの作成
 } @Override
 public void onDestroyView() {
 super.onDestroyView(); realm.close(); } } zaki@realm.io
  23. ࣮ࡍͷ࢖͍ํ ඇLooperεϨουฤ public class MyThread extends Thread {
 @Override
 public

    void run() { while(true) { // なんらかの処理 //結果を保存 Realm realm = Realm.getDefaultInstance(); try {
 realm.executeTransaction(realm -> { realm.insert(person);
 });
 } finally {
 realm.close();
 } } } } zaki@realm.io
  24. ࣮ࡍͷ࢖͍ํ ඇLooperεϨουฤ public class MyThread extends Thread {
 @Override
 public

    void run() { Realm realm = Realm.getDefaultInstance(); try { RealmResults<Article> articles = ...;
 while(true) { realm.waitForChange(); //articlesを読み出して必要な処理を実行 } } finally {
 realm.close();
 } } } zaki@realm.io
  25. public class MyApplication extends Application {
 @Override
 public void onCreate()

    {
 super.onCreate(); 
 Realm.init(this);
 }
 }
 શମͷॳظԽ zaki@realm.io
  26. unmanaged/managed Article unmanagedArticle = new Article(); unmanagedArticle.isManaged(); // false unmanagedArticle.setTitle("meetup");

    // OK RealmResults<Article> articles = ...; final Article managedArticle = articles.first(); managedArticle.isManaged(); // true managedArticle.setTitle("meetup"); // τϥϯβΫγϣϯΤϥʔ realm.executeTransaction(realm -> { managedArticle.setTitle("meetup"); // OK });
 zaki@realm.io
  27. byte[] key = new byte[64];
 new SecureRandom().nextBytes(key);
 final RealmConfiguration config

    = new RealmConfiguration.Builder()
 .encryptionKey(key)
 .build();
 
 final Realm realm = Realm.getInstance(config);
 ҉߸Խ zaki@realm.io
  28. byte[] key = new byte[64];
 new SecureRandom().nextBytes(key);
 final RealmConfiguration config

    = new RealmConfiguration.Builder()
 .encryptionKey(key)
 .build();
 
 final Realm realm = Realm.getInstance(config);
 ҉߸Խ 伴͸64όΠτ zaki@realm.io
  29. byte[] key = new byte[64];
 new SecureRandom().nextBytes(key);
 final RealmConfiguration config

    = new RealmConfiguration.Builder()
 .encryptionKey(key)
 .build();
 
 final Realm realm = Realm.getInstance(config);
 ҉߸Խ 伴ͷੜ੒ͷҰྫ zaki@realm.io
  30. byte[] key = new byte[64];
 new SecureRandom().nextBytes(key);
 final RealmConfiguration config

    = new RealmConfiguration.Builder()
 .encryptionKey(key)
 .build();
 
 final Realm realm = Realm.getInstance(config);
 ҉߸Խ 伴Ληοτͨ͠ઃఆ৘ใͷ࡞੒ zaki@realm.io
  31. byte[] key = new byte[64];
 new SecureRandom().nextBytes(key);
 final RealmConfiguration config

    = new RealmConfiguration.Builder()
 .encryptionKey(key)
 .build();
 
 final Realm realm = Realm.getInstance(config);
 ҉߸Խ RealmΠϯελϯεͷऔಘ zaki@realm.io
  32. Realm Mobile Platform Realm Mobile Database Data Sync User Identify

    ٔ،ٕة؎يず劍 ِ٦ؠ٦陎ⴽ zaki@realm.io
  33. Realm Mobile Platform Realm Mobile Database Data Sync Access Control

    User Identify ٔ،ٕة؎يず劍 ِ٦ؠ٦陎ⴽ ر٦ةⰟ剣 zaki@realm.io
  34. Realm Mobile Platform Realm Mobile Database Data Sync Access Control

    User Identify Event Handling ٔ،ٕة؎يず劍 ِ٦ؠ٦陎ⴽ ر٦ةⰟ剣 ؽآطأٗآحؙ zaki@realm.io
  35. ΞΫηετʔΫϯʢCentOSʣ # cd /etc/realm/ # ls admin_token.base64 configuration.yml token- signature.key

    token-signature.pub # cat admin_token.base64 ewoJImlkZW50a... zaki@realm.io
  36. جຊతͳ࢖͍ํ(Android) ೝূ Credentials creds = Credentials.usernamePassword(username, password, true);
 User.loginAsync(creds, "https://realm.example.com:9443/auth",

    new User.Callback() {
 @Override
 public void onSuccess(User user) { // ログイン成功時の処理 }
 
 @Override
 public void onError(ObjectServerError error) {
 // エラー処理
 }
 } ); zaki@realm.io
  37. جຊతͳ࢖͍ํ(iOS) User.authenticate(with: Credential.usernamePassword(username: "username", password: "password", actions: []), server: URL(string:

    "http://128.199.141.202:9080")!, onCompletion: { user, error in guard let user = user else { fatalError(String(describing: error)) } let configuration = Realm.Configuration( syncConfiguration: (user, URL(string: "realm://128.199.141.202:9080/~/realmtasks")!) ) self.realm = try! Realm(configuration: configuration) }) zaki@realm.io
  38. FacebookϩάΠϯ facebookAuth = new FacebookAuth(loginButton) {
 @Override
 public void onRegistrationComplete(LoginResult

    loginResult) {
 SyncCredentials credentials = SyncCredentials.facebook( loginResult.getAccessToken().getToken());
 SyncUser.loginAsync(credentials, AUTH_URL, LoginActivity.this);
 }
 };
 zaki@realm.io
  39. Typical Application Data Flow Native object JSON Native object SQL

    Native object JSON Native object SQLite/CoreData SQLite/CoreData zaki@realm.io
  40. ΠϕϯτϋϯυϦϯά var Realm = require('realm'); var filter_callback = function(realm_name) {

    ... }; var change_notification_callback = function(realm_name, realm) { var channels = realm.objects('Channel'); for (var i = 0; i < channels.length; ++i) { var channel = channels[i]; ... } }; Realm.setGlobalSyncListener(local_root_dir, server_base_url, access_token, filter_callback, change_notification_callback); zaki@realm.io
  41. Realm Mobile Platform ˖ .PCJMF%BUBCBTF ˖ ⿽倯ぢךر٦ةず劍 ˖ ٔ،ٕة؎ي ˖

    ء٦يٖأ ˖ ؝ٝؿؙٔزך荈⹛鍑寸 ˖ ِ٦ؠ٦陎ⴽ ˖ ؎كٝزعٝسؚٔٝ • αʔόʔϓογϡ • σʔλڞ༗ • ΞΫηείϯτϩʔϧ zaki@realm.io
  42. ίϯϑϦΫτͷղܾ • جຊ͸ޙউͪ • ಉ͡ΞΠςϜʹผͷมߋΛՃ͑ͨ৔߹ɺޙʹىͬͨ͜มߋ͕࠾༻ ͞Ε·͢ɻ • ಉ͡ΠϯσοΫε΁ͷૠೖ͸࣌ؒॱʹͳΔ • ࡟আ͸͢΂ͯʹউͭ

    • ͋ΔΞΠςϜ͕࡟আ͞ΕͯɺผͷσόΠεͰ͸ಉ͡ΞΠςϜΛมߋ ͨ͠ɺͱ͍͏৔߹͸ɺ࡟আ͚͕ͩى͜Γ·͢ɻ zaki@realm.io
  43. Recent Updates • Realm Objective-C/Swift 2.0.3 • Realm Java 2.2.0

    • Realm React Native 0.14.0 • Realm Xamarin 0.78 zaki@realm.io
  44. Where to find us • $ Realm Japan User Group:

    facebook.com/groups/realmjp • $ Twitter: twitter.com/realmJapan • GitHub: github.com/realm • $ StackOverflow: ja.stackoverflow.com/questions/tagged/realm • $ Email: help@realm.io • $ Slack: slack.realm.io/ zaki@realm.io