Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ /

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
@Required
public String firstName;
@Required
public int age;
}
class Person: RealmObject { // Realm schema version 0
var firstName: String = ""
var age: int = 0
}

O exemplo a seguir adiciona uma propriedade lastName ao esquema de Pessoa original:

public class Person extends RealmObject { // Realm schema version 1
@Required
public String firstName;
@Required
public String lastName;
@Required
public int age;
}
class Person: RealmObject { // Realm schema version 1
var firstName: String = ""
var lastName: String = ""
var age: int = 0
}

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
@Required
public String fullName;
@Required
public int age;
}
class Person: RealmObject { // Realm schema version 2
var fullName: String = ""
var age: int = 0
}

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
@Required
public String fullName;
@Required
public Date birthday = new Date();
}
class Person: RealmObject { // Realm schema version 3
var fullName: String = ""
var birthday: Date = Date()
}

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 {
@Override
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++;
}
}
};
@RealmModule(classes = { Person.class })
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++
}
}
}
@RealmModule(classes = { Person::class.java })
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.

Voltar

Relacionamentos