React NativeアプリのDBにRealmを導入してみた話とか

鍼灸の、いや、進級の季節……(何かあったらしい)。

 

前回の続き。

kdnakt.hatenablog.com

 

続々々々……だと流石にうっとおしいのでタイトルはそれっぽくしてみた。

 

[DBとしてRealmを使ってみた]

f:id:kidani_a:20180301094452p:plain

前回と特に画面に変更がある訳ではないが、この「TargetTime」すなわちプランクの目標値や、日々のプランクの実績をDBに保存しておけるようにしたい。

 

という訳でとりあえず目標値をDBに保存してみる。

realm.write(() => {
  realm.create('TargetTime', {seconds: text}, true);
}); 

 

[Realmでマイグレーション]

で、どうもこれだと、プライマリキーがないので、無限にレコードが増え続けるっぽい。取得したレコードの件数をプリントデバッグしたら100件超えててどんだけ試行錯誤してるんだってなった。

 

プライマリキーを利用するには、

Realm.open({
  schema: [{
    name: 'TargetTime',
    primaryKey: 'id',
    properties: {
      id: 'string',
      seconds: 'int',
    },
  }],
});

てな感じにスキーマを変更する必要がある。

 

保存するときもこんな感じ。

realm.create('TargetTime', {
  id: 'TargetTime',
  seconds: text,
}, true);

 

で、うまくいくと思ったらコレ。

f:id:kidani_a:20180310012421p:plain

 

公式サイトを見にいくと、エラーメッセージそのままにマイグレーションせえやとのお達しが。

realm.io

 

雑に実装してみる。 

Realm.open({
  schema: [{
    name: 'TargetTime',
    primaryKey: 'id',
    properties: {
      id: 'string',
      seconds: 'int',
    },
  }],
  schemaVersion: 2,
  migration: (oldR, newR) => {
    const oldObjects = oldR.objects('TargetTime');
    const newObjects = newR.objects('TargetTime');

    for (let i = 0; i < oldObjects.length; i++) {
      newObjects[i].id = 'TargetTime' + i;
    }
  },
});

 

エラーは消えた。

ただ、無駄なレコードがDBに残ってるのも微妙なので、一時的にcomponentWillMount()内で登録済みのレコードを全削除して初期化しておいた(今気付いたけどmigrationでそうすれば良かったか)。

 

あとは、設定画面とタイマー画面でそれぞれDBスキーマ情報を記述していたので、共通化してDB周りは一旦終了。

 

 

 

[まとめ] 

コードはこちら。

github.com

 
今日のブログ執筆BGMはこちら。

www.youtube.com

 

[2018/03/14追記]

続きを書いた。

kdnakt.hatenablog.com