オブジェクト モデルの変更 - React Native SDK
注意
同期された Realm のスキーマ プロパティの変更
次のページでは、ローカル Realm のスキーマ プロパティを変更する方法を示します。 同期された Realm のスキーマ プロパティを変更する方法を学びます。
オブジェクト スキーマを更新するときは、スキーマのバージョンを増やして移行を実行する必要があります。
スキーマ更新によってオプションのプロパティが追加されるか、プロパティが削除される場合、Realm は移行を自動的に実行できます。 schemaVersion
を増やす必要があるだけです。
より複雑なスキーマ更新では、 migration
関数で移行ロジックを手動で指定する必要もあります。 これには、次のような変更が含まれる場合があります。
デフォルト値を入力する必要がある必須プロパティの追加
フィールドの組み合わせ
フィールドの名前を変更する
フィールドの型の変更
オブジェクトから埋め込みオブジェクトへの変換
Tip
開発中のバイパス移行
アプリケーションを開発またはデバッグする際には、Realm を移行するのではなく、Realm を削除することをお勧めします。 baseConfiguration.deleteRealmIfMigrationNetedを使用する スキーマの不一致により移行が必要な場合に、データベースを自動的に削除するプロパティ。
このプロパティをtrue
に設定して、アプリを本番環境にリリースしないでください。
スキーマ バージョン
スキーマ バージョンは、ある時点におけるRealm スキーマの状態を識別します。 Realm は各 Realm のスキーマ バージョンを追跡し、それを使用して各 Realm 内のオブジェクトを正しいスキーマにマッピングします。
スキーマ バージョンは、Realm 構成に含めることができる昇順の整数です。 クライアント アプリケーションでバージョン番号が指定されていない場合、Realm はデフォルトでバージョン0
になります。
重要
バージョンを単調に増加させる
移行によって、Realm をより高いスキーマ バージョンに更新する必要があります。 Realm は、クライアント アプリケーションが Realm の現在のバージョンよりも低いスキーマ バージョンを使用している場合、または指定されたスキーマ バージョンが Realm の現在のバージョンと同じであるが、異なるスキーマを含む場合にエラーをスローします。
移行
移行は、Realm とそれに含まれるすべてのオブジェクトを、あるスキーマ バージョンから新しいバージョンに更新する関数です。 移行により、新機能やリファクターに対応するためにオブジェクト スキーマを経時的に変更することができます。
Realm の現在のバージョンよりも大きい スキーマ バージョン で構成を作成すると、Realm は定義した移行関数を実行します。 この関数は Realm のバージョン番号にアクセスし、新しいスキーマに準拠するように Realm 内のオブジェクトを段階的に更新します。
Realm は、新しいプロパティや削除されたプロパティなど、特定の変更を自動的に移行しますが、更新されたオブジェクト スキーマでデフォルト値が指定されていない限り、新しいプロパティの値が自動的に設定されることはありません。 移行関数で追加のロジックを定義して、プロパティ値をさらにカスタマイズできます。
プロパティを追加する
スキーマにプロパティを追加するには、新しいプロパティをオブジェクトのクラスに追加し、 Configuration
オブジェクトのschemaVersion
を設定します。
例
デフォルトであるスキーマ バージョン0
を使用する Realm のオブジェクトタイプは、 firstName
およびlastName
プロパティを持つPerson
オブジェクトタイプです。 Person
クラスにage
プロパティを追加することにしました。
更新されたPerson
スキーマに準拠するように Realm を移行するには、 Configuration
内の Realm のスキーマ バージョンを1
に設定します。 最後に、構成オブジェクトをcreateRealmContext()
メソッドに渡します。
class Person extends Realm.Object { static schema = { name: 'Person', properties: { _id: 'string', firstName: 'string', lastName: 'string', // add a new property, 'age' to the schema age: 'int', }, }; } const config = { schema: [Person], // Increment the 'schemaVersion', since 'age' has been added to the schema. // The initial schemaVersion is 0. schemaVersion: 2, }; // pass the configuration object with the updated 'schemaVersion' to // createRealmContext() const {RealmProvider} = createRealmContext(config);
class Person extends Realm.Object<Person> { _id!: string; firstName!: string; lastName!: string; age!: number; static schema: ObjectSchema = { name: 'Person', properties: { _id: 'string', firstName: 'string', lastName: 'string', // add a new property, 'age' to the schema age: 'int', }, }; } const config: Realm.Configuration = { schema: [Person], // Increment the 'schemaVersion', since 'age' has been added to the schema. // The initial schemaVersion is 0. schemaVersion: 2, }; // pass the configuration object with the updated 'schemaVersion' to // createRealmContext() const {RealmProvider} = createRealmContext(config);
プロパティを削除する
スキーマからプロパティを削除するには、オブジェクトのクラスからプロパティを削除し、構成オブジェクトのschemaVersion
を設定します。 プロパティを削除しても、既存のオブジェクトには影響しません。
例
デフォルトであるスキーマ バージョン0
を使用する Realm のオブジェクトタイプは、 lastName
プロパティを持つPerson
オブジェクトタイプです。 スキーマから プロパティを削除することにしました。
更新されたPerson
スキーマに準拠するように Realm を移行するには、 Configuration
オブジェクトで Realm のスキーマ バージョンを1
に設定します。 最後に、構成オブジェクトをcreateRealmContext()
メソッドに渡します。
class Person extends Realm.Object { static schema = { name: 'Person', properties: { _id: 'string', firstName: 'string', age: 'int', }, }; } const config = { schema: [Person], // Increment the 'schemaVersion', since 'lastName' has been removed from the schema. // The initial schemaVersion is 0. schemaVersion: 1, }; // pass the configuration object with the updated 'schemaVersion' to createRealmContext() const {RealmProvider} = createRealmContext(config);
class Person extends Realm.Object<Person> { _id!: string; firstName!: string; age!: number; static schema: ObjectSchema = { name: 'Person', properties: { _id: 'string', firstName: 'string', age: 'int', }, }; } const config: Realm.Configuration = { schema: [Person], // Increment the 'schemaVersion', since 'lastName' has been removed from the schema. // The initial schemaVersion is 0. schemaVersion: 1, }; // pass the configuration object with the updated 'schemaVersion' to createRealmContext() const {RealmProvider} = createRealmContext(config);
プロパティの名前を変更する
オブジェクト プロパティの名前を変更するには、オブジェクト スキーマ内のプロパティ名を変更し、増加したスキーマ バージョンと、新しいプロパティ名を使用するように既存のオブジェクトをアップデートする移行関数を使用して Realm 構成を作成します。
移行では、プロパティの名前を直接変更することはできません。 代わりに、更新された名前で新しいプロパティを作成し、古いプロパティから値をコピーして、古いプロパティを削除できます。
例
デフォルトのスキーマ バージョン0
を使用する Realm のオブジェクトタイプはPerson
です。 元のスキーマにはfirstName
lastName
フィールドと フィールドがありました。後で、 Person
クラスで結合されたfullName
フィールドを使用することが決定され、個別のfirstName
フィールドとlastName
フィールドが削除されます。
更新されたPerson
スキーマに準拠するように Realm を移行するには、構成オブジェクトを作成し、Realm のスキーマ バージョンを1
に設定し、既存のfirstName
に基づいてfullName
の値を設定する移行関数を定義します。 lastName
プロパティ。 最後に、構成オブジェクトをcreateRealmContext()
メソッドに渡します。
class Person extends Realm.Object { static schema = { name: 'Person', properties: { _id: 'string', // rename the 'firstName' and 'lastName' property, to 'fullName' // in the schema fullName: 'string', age: 'int', }, }; } const config = { schema: [Person], // Increment the 'schemaVersion', since 'fullName' has replaced // 'firstName' and 'lastName' in the schema. // The initial schemaVersion is 0. schemaVersion: 1, onMigration: (oldRealm, newRealm) => { // only apply this change if upgrading schemaVersion if (oldRealm.schemaVersion < 1) { 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}`; } } }, }; // pass the configuration object with the updated 'schemaVersion' and // 'migration' function to createRealmContext() const {RealmProvider} = createRealmContext(config);
class Person extends Realm.Object<Person> { _id!: string; fullName!: string; age!: number; static schema: ObjectSchema = { name: 'Person', properties: { _id: 'string', // rename the 'firstName' and 'lastName' property, to 'fullName' // in the schema fullName: 'string', age: 'int', }, }; } class OldObjectModel extends Realm.Object<OldObjectModel> { _id!: string; firstName!: string; lastName!: string; age!: number; static schema: ObjectSchema = { name: 'Person', properties: { _id: 'string', firstName: 'string', lastName: 'string', }, }; } const config: Realm.Configuration = { schema: [Person], // Increment the 'schemaVersion', since 'fullName' has replaced // 'firstName' and 'lastName' in the schema. // The initial schemaVersion is 0. schemaVersion: 1, onMigration: (oldRealm: Realm, newRealm: Realm) => { // only apply this change if upgrading schemaVersion if (oldRealm.schemaVersion < 1) { const oldObjects: Realm.Results<OldObjectModel> = oldRealm.objects(OldObjectModel); const newObjects: Realm.Results<Person> = 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}`; } } }, }; // pass the configuration object with the updated 'schemaVersion' and // 'migration' function to createRealmContext() const {RealmProvider} = createRealmContext(config);
プロパティ タイプの変更
プロパティのタイプを変更するには、変更するフィールドのプロパティタイプを新しいデータ型に設定します。 次に、構成オブジェクトのschemaVersion
とmigration
コールバック関数を設定します。
注意
同期された Realmは、古いクライアントが新しいクライアントと同期できるようにするために、重大でない変更のみをサポートします。 つまり、同期された Realm では、スキーマのプロパティのタイプの変更はサポートされていません。
例
デフォルトのスキーマ バージョン0
を使用する Realm のオブジェクトタイプはPerson
です。 元のスキーマには、プロパティ タイプがint
である_id
がありました。 後で、 Person
クラスの_id
フィールドがObjectId
型である必要があることを決定し、スキーマを更新します。
更新されたPerson
スキーマに準拠するように Realm を移行するには、 Configuration
オブジェクトを作成し、Realm のスキーマ バージョンを1
に設定し、整数型をObject ID
型に変換する移行関数を定義します。 最後に、構成オブジェクトをcreateRealmContext()
メソッドに渡します。
class Person extends Realm.Object { static schema = { name: 'Person', properties: { // update the data type of '_id' to be 'objectId' within the schema _id: 'objectId', firstName: 'string', lastName: 'string', }, }; } const config = { schema: [Person], // Increment the 'schemaVersion', since the property type of '_id' // has been modified. // The initial schemaVersion is 0. schemaVersion: 1, onMigration: (oldRealm, newRealm) => { if (oldRealm.schemaVersion < 1) { const oldObjects = oldRealm.objects(Person); const newObjects = newRealm.objects(Person); // 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 = new Realm.BSON.ObjectId(oldObject._id); } } }, }; // Pass the configuration object with the updated // 'schemaVersion' and 'migration' function to createRealmContext() const {RealmProvider} = createRealmContext(config);
class Person extends Realm.Object<Person> { _id!: Realm.BSON.ObjectId; firstName!: string; lastName!: string; age!: number; static schema: ObjectSchema = { name: 'Person', properties: { // Update the data type of '_id' to be 'objectId' within the schema. _id: 'objectId', firstName: 'string', lastName: 'string', }, }; } // `OldObjectModel` is only used for type injection for `oldRealm`. It is // not related to the `Person` object model. interface OldObjectModel { _id: Realm.BSON.ObjectId; firstName: string; lastName: string; age: number; } const config: Realm.Configuration = { schema: [Person], // Increment the 'schemaVersion', since the property type of '_id' // has been modified. // The initial schemaVersion is 0. schemaVersion: 1, onMigration: (oldRealm: Realm, newRealm: Realm) => { if (oldRealm.schemaVersion < 1) { const oldObjects: Realm.Results<OldObjectModel> = oldRealm.objects(Person); const newObjects: Realm.Results<Person> = newRealm.objects(Person); // 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 = new Realm.BSON.ObjectId(oldObject._id); } } }, }; // Pass the configuration object with the updated // 'schemaVersion' and 'migration' function to createRealmContext(). const {RealmProvider} = createRealmContext(config);