Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

オブジェクト モデルの変更 - 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);

重要

同期された Realm

同期されたRealmは、古いクライアントが新しいクライアントと同期できるようにするために、重大じゃない変更(追加と呼ばれる)のみをサポートします。 名前を完全に変更するには古いプロパティを削除する必要があるため、クライアントのリセットが必要な同期プロパティの名前を変更することはできません。 代わりに、古いプロパティを削除せずに、名前が変更されたプロパティを追加することを検討してください。 あるいは、 mapToを使用して、既存の内部名を使用してデータを保存し、コードでは別の名前を使用できるようにします。

プロパティのタイプを変更するには、変更するフィールドのプロパティタイプを新しいデータ型に設定します。 次に、構成オブジェクトのschemaVersionmigrationコールバック関数を設定します。

注意

同期された 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);

戻る

関係と埋め込みオブジェクト