鍼灸の、いや、進級の季節……(何かあったらしい)。
前回の続き。
続々々々……だと流石にうっとおしいのでタイトルはそれっぽくしてみた。
[DBとしてRealmを使ってみた]
前回と特に画面に変更がある訳ではないが、この「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);
で、うまくいくと思ったらコレ。
公式サイトを見にいくと、エラーメッセージそのままにマイグレーションせえやとのお達しが。
雑に実装してみる。
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周りは一旦終了。
[まとめ]
コードはこちら。
今日のブログ執筆BGMはこちら。
[2018/03/14追記]
続きを書いた。