オブジェクトモデルの変更 - Node.js SDK
スキーマ バージョン
スキーマ バージョンは、ある時点におけるRealm スキーマの状態を識別します。 Realm は各 Realm のスキーマ バージョンを追跡し、それを使用して各 Realm 内のオブジェクトを正しいスキーマにマッピングします。
スキーマ バージョンは昇順の整数であり、Realm を開くときに Realm 構成に任意で含めることができます。 クライアント アプリケーションが Realm を開くときにバージョン番号を指定しない場合、Realm はデフォルトでバージョン 0
になります。
重要
バージョンを単調に増加させる
移行によって、Realm をより高いスキーマ バージョンに更新する必要があります。 Realm は、Realm の現在のバージョンよりも低いスキーマ バージョンでクライアント アプリケーションが Realm を開き、または指定されたスキーマ バージョンが Realm の現在のバージョンと同じであるが、異なるオブジェクト スキーマを含む場合にエラーをスローします。
移行
移行は、Realm とそれに含まれるすべてのオブジェクトを、あるスキーマ バージョンから新しいバージョンに更新する関数です。 移行により、新しい機能やリファクターに対応するために、オブジェクト スキーマを経時的に変更する柔軟性が付与されます。
Tip
開発中のバイパス移行
アプリケーションを開発またはデバッグする際には、Realm を移行するのではなく、Realm を削除することをお勧めします。 スキーマの不一致により移行が必要になる場合に、 deleteRealmIfMigrationNeeded
フラグを使用してデータベースを自動的に削除します。
このフラグをtrue
に設定して本番環境にアプリをリリース しないでください 。
Realm の現在のバージョンよりも大きいスキーマ バージョンで既存の Realm を開くたびに、Realm は定義した移行関数を実行します。 この関数は Realm のバージョン番号にアクセスし、新しいスキーマに準拠するように Realm 内のオブジェクトを段階的に更新します。
Realm は、新しいプロパティや削除されたプロパティなど、特定の変更を自動的に移行しますが、更新されたオブジェクト スキーマでデフォルト値が指定されていない限り、新しいプロパティの値が自動的に設定されることはありません。 移行関数で追加のロジックを定義して、プロパティ値をさらにカスタマイズできます。
注意
同期された Realm のスキーマ プロパティの変更
次のページでは、ローカル Realm のスキーマ プロパティを変更する方法を示します。 同期された Realm のスキーマ プロパティを変更する方法を学びます。
プロパティを追加する
スキーマにプロパティを追加するには、新しいプロパティをオブジェクトのクラスに追加し、 Realm の構成オブジェクトのschemaVersion
を設定します。
例
スキーマ バージョン1
を使用する Realm には、 firstName
とlastName
プロパティを持つPerson
オブジェクトタイプがあります。 開発者は、 Person
クラスにage
プロパティを追加することを決定します。
更新されたPerson
スキーマに準拠するように Realm を移行するには、開発者は Realm のスキーマ バージョンを2
に設定します。
const Person = { name: 'Person', properties: { firstName: 'string', lastName: 'string', age: 'int' } }
const realm = await Realm.open({ schema: [Person], schemaVersion: 2 });
プロパティを削除する
スキーマからプロパティを削除するには、オブジェクトのクラスからプロパティを削除し、 Realm の 構成オブジェクト のschemaVersion
を設定します。 プロパティを削除しても、既存のオブジェクトには影響しません。
例
スキーマ バージョン1
を使用する Realm には、 weight
プロパティを持つDog
オブジェクトタイプがあります。 開発者は、スキーマからプロパティを削除することを決定します。
更新されたDog
スキーマに準拠するように Realm を移行するには、開発者は Realm のスキーマ バージョンを2
に設定します。
const realm = await Realm.open({ schema: [Dog], schemaVersion: 2 });
プロパティの名前を変更する
オブジェクト プロパティの名前を変更するには、オブジェクト スキーマでプロパティ名を変更し、増加したスキーマ バージョンと、新しいプロパティ名を使用するように既存のオブジェクトをアップデートする移行関数を使用してRealmを開きます。
移行では、プロパティの名前を直接変更することはできません。 代わりに、更新された名前で新しいプロパティを作成し、古いプロパティから値をコピーして、古いプロパティを削除できます。
例
スキーマ バージョン1
を使用する Realm のオブジェクトタイプはPerson
です。 元のスキーマにはfirstName
lastName
フィールドと フィールドがありました。開発者は後で、 Person
クラスが結合されたfullName
フィールドを使用する必要があると判断し、個別のfirstName
フィールドとlastName
フィールドを削除します。
更新されたPerson
スキーマに準拠するように Realm を移行するには、開発者は Realm の2
スキーマ バージョン をfullName
に設定し、既存のfirstName
プロパティとlastName
プロパティに基づいて の値を設定するための移行関数を定義します。 。
Realm.open({ schema: [Person], schemaVersion: 2, onMigration: (oldRealm, newRealm) => { // only apply this change if upgrading to schemaVersion 2 if (oldRealm.schemaVersion < 2) { const oldObjects = oldRealm.objects('Person'); const newObjects = newRealm.objects('Person'); // loop through all objects and set the fullName property in the new schema for (const objectIndex in oldObjects) { const oldObject = oldObjects[objectIndex]; const newObject = newObjects[objectIndex]; newObject.fullName = `${oldObject.firstName} ${oldObject.lastName}`; } } } });
プロパティ タイプの変更
プロパティのタイプを変更するには、変更するフィールドのプロパティタイプを新しいデータ型に設定します。 次に、 Realm の構成オブジェクトのschemaVersion
とmigration
コールバック関数を設定します。
注意
同期された Realmは、古いクライアントが新しいクライアントと同期できるようにするために、重大でない変更のみをサポートします。 つまり、同期された Realm では、スキーマのプロパティのタイプの変更はサポートされていません。
例
スキーマ バージョン1
を使用する Realm のオブジェクトタイプはDog
です。 元のスキーマには、プロパティ タイプがObject ID
である_id
がありました。 開発者は後で、 Dog
クラスの_id
フィールドがstring
型である必要があると判断し、スキーマを更新します。
更新されたDog
スキーマに準拠するように Realm を移行するには、開発者は Realm のスキーマ バージョンを2
に設定し、 Object ID
型をstring
型に変換する移行関数を定義します。
const realm = await Realm.open({ schema: [Dog], schemaVersion: 2, onMigration: (oldRealm, newRealm) => { if(oldRealm.schemaVersion < 2){ const oldObjects = oldRealm.objects('Dog'); const newObjects = newRealm.objects('Dog'); // loop through all objects and set the _id property in the new schema for (const objectIndex in oldObjects) { const oldObject = oldObjects[objectIndex]; const newObject = newObjects[objectIndex]; newObject._id = oldObject._id.toHexString(); } } }, });