鍼灸の、いや、進級の季節……(何かあったらしい)。
前回の続き。
続々々々……だと流石にうっとおしいのでタイトルはそれっぽくしてみた。
[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追記]
続きを書いた。