Alterar um modelo de objetos - SDK Java
Os exemplos seguintes demonstram como adicionar, excluir e modificar propriedades em um esquema. Primeiro, faça a alteração necessária no esquema. Em seguida, aumente a versão do esquema. Finalmente, se a alteração for significativa (destrutiva), crie umafunção de migração correspondente para mover dados do esquema original para o esquema atualizado.
Observação
Atualização de versões no Realm Open
Suponha que cada alteração de esquema mostrada no exemplo a seguir ocorra após o aplicação ter usado o esquema existente. Os novos números de versão do esquema se aplicam somente depois que você abre o Realm e especifica explicitamente o novo número da versão. Em outras palavras, você não pode especificar a versão 3 sem especificar e utilizar previamente as versões 0, 1 e 2.
Um Realm que usa a versão do esquema 0
tem um tipo de objeto Person
:
public class Person extends RealmObject { // Realm schema version 0 public String firstName; public int age; }
class Person: RealmObject { // Realm schema version 0 var firstName: String = "" var age: int = 0 }
A. Adicionar uma propriedade
O exemplo a seguir adiciona uma propriedade lastName
ao esquema de Pessoa original:
public class Person extends RealmObject { // Realm schema version 1 public String firstName; public String lastName; public int age; }
class Person: RealmObject { // Realm schema version 1 var firstName: String = "" var lastName: String = "" var age: int = 0 }
B. Excluir uma propriedade
O exemplo a seguir usa uma propriedade fullName
combinada em vez das propriedades firstName
e lastName
separadas no esquema Person original:
public class Person extends RealmObject { // Realm schema version 2 public String fullName; public int age; }
class Person: RealmObject { // Realm schema version 2 var fullName: String = "" var age: int = 0 }
C. Modificar um tipo de propriedade ou renomear uma propriedade
O exemplo a seguir modifica a propriedade age
no esquema Pessoa original , renomeando-a para birthday
e alterando o tipo para Date
:
public class Person extends RealmObject { // Realm schema version 3 public String fullName; public Date birthday = new Date(); }
class Person: RealmObject { // Realm schema version 3 var fullName: String = "" var birthday: Date = Date() }
D. Funções de migração
Para migrar o realm para estar em conformidade com o esquema Person
atualizado, defina a versão do esquema do realm como 3
e defina uma função de migração para definir o valor de fullName
com base nas propriedades firstName
e lastName
existentes e nas valor de birthday
com base em age
:
public class Migration implements RealmMigration { public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { Long version = oldVersion; // DynamicRealm exposes an editable schema RealmSchema schema = realm.getSchema(); // Changes from version 0 to 1: Adding lastName. // All properties will be initialized with the default value "". if (version == 0L) { schema.get("Person") .addField("lastName", String.class, FieldAttribute.REQUIRED); version++; } // Changes from version 1 to 2: combine firstName/lastName into fullName if (version == 1L) { schema.get("Person") .addField("fullName", String.class, FieldAttribute.REQUIRED) .transform( DynamicRealmObject obj -> { String name = "${obj.getString("firstName")} ${obj.getString("lastName")}"; obj.setString("fullName", name); }) .removeField("firstName") .removeField("lastName"); version++; } // Changes from version 2 to 3: replace age with birthday if (version == 2L) { schema.get("Person") .addField("birthday", Date::class.java, FieldAttribute.REQUIRED) .transform(DynamicRealmObject obj -> { Int birthYear = Date().year - obj.getInt("age"); obj.setDate("birthday", Date(birthYear, 1, 1)); }) .removeField("age"); version++; } } }; public class Module {} RealmConfiguration config = new RealmConfiguration.Builder() .modules(new Module()) .schemaVersion(3) // Must be bumped when the schema changes .migration(new Migration()) // Migration to run instead of throwing an exception .build();
val migration = object: RealmMigration { override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) { var version: Long = oldVersion // DynamicRealm exposes an editable schema val schema: RealmSchema = realm.schema // Changes from version 0 to 1: Adding lastName. // All properties will be initialized with the default value "". if (version == 0L) { schema.get("Person")!! .addField("lastName", String::class.java, FieldAttribute.REQUIRED) version++ } // Changes from version 1 to 2: Combining firstName/lastName into fullName if (version == 1L) { schema.get("Person")!! .addField("fullName", String::class.java, FieldAttribute.REQUIRED) .transform { obj: DynamicRealmObject -> val name = "${obj.getString("firstName")} ${obj.getString("lastName")}" obj.setString("fullName", name) } .removeField("firstName") .removeField("lastName") version++ } // Changes from version 2 to 3: Replace age with birthday if (version == 2L) { schema.get("Person")!! .addField("birthday", Date::class.java, FieldAttribute.REQUIRED) .transform { obj: DynamicRealmObject -> var birthYear = Date().year - obj.getInt("age") obj.setDate("birthday", Date(birthYear, 1, 1)) } .removeField("age") version++ } } } class Module val config = RealmConfiguration.Builder() .schemaVersion(3) // Must be bumped when the schema changes .migration(migration) // Migration to run instead of throwing an exception .build()
Você pode fazer alterações no esquema de um Realm sincronizado modificando o JSON schema definido no backend do seu aplicativo. Os domínios sincronizados não exigem funções de migração, pois as alterações de quebra em esquemas sincronizados causam erros de sincronização. A sincronização lida automaticamente com alterações não interrompidas em esquemas de Realm sincronizados. Como resultado, as versões antigas e as novas versões do seu esquema podem ser sincronizadas à medida que os usuários atualizam seus aplicativos.
Para saber mais sobre alterações de esquema em domínios sincronizados, consulte alterações de esquema sincronizadas.
Observação
Modo de desenvolvimento: apenas para definir seu esquema inicial
Você pode definir a primeira versão do esquema sincronizado do seu aplicativo usando o Modo de desenvolvimento, que traduz automaticamente os modelos de cliente em JSON schema no backend. No entanto, você deve fazer alterações subsequentes em seu esquema por meio de edições no JSON schema em seu aplicativo.
Dica
Você pode usar o RealmConfiguration.shouldDeleteRealmIfMigrationNeeded() método de construtor ao construir um Realm para excluí- Realm em vez de executar uma migração quando uma migração é necessária. Isso pode ser útil durante o desenvolvimento quando os esquemas mudam com frequência.