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

Definir um esquema de objeto Realm - Flutter SDK

Nesta página

  • Criar modelo
  • Importar Realm
  • Criar diretiva de parte de arquivo gerada
  • Criar modelo de domínio
  • Gerar RealmObject
  • Usar RealmObject no aplicativo
  • Usando esquemas com Device Sync
  • Tipos de dados suportados
  • Anotações da propriedade
  • Definir Propriedades de Relacionamento
  • Mapear um Modelo ou Classe para um Nome Diferente
  • Dados não estruturados do modelo
  • Gerar o RealmObject
  • Definir um objeto assimétrico

Importante

Flutter SDK v2.0.0 Alteração significativa nos arquivos gerados

Versão do Flutter SDK 2.0.0 introduz uma atualização no construtor, que afeta a forma como os arquivos são gerados. Na2.0.0 e posterior, todos os arquivos gerados usam a convenção de nomenclatura .realm.dart em vez de .g.dart.

Esta é uma alteração interruptiva significativa para aplicativos existentes. Para obter informações sobre como atualizar um aplicativo existente de uma versão anterior do SDK para a v2.0.0 ou posterior, consulte Atualizar para o Flutter SDK v2.0.0.

Um esquema de objeto é um objeto de configuração que define as propriedades e relacionamentos de um objeto de Realm. Os aplicativos cliente de realm definem esquemas de objeto com a implementação de classe nativa em sua respectiva linguagem usando o Esquema de Objeto.

Os esquemas de objeto especificam restrições nas propriedades do objeto, como o tipo de dados de cada propriedade e se uma propriedade é necessária ou não. Os esquemas também podem definir relações entre tipos de objeto em um realm.

1

Importe o pacote do Realm SDK na parte superior do seu arquivo.

schemas.dart
import 'package:realm/realm.dart';
schemas.dart
import 'package:realm_dart/realm.dart';
2

Alterado na versão v2.0.0: Os arquivos gerados são nomeados .realm.dart em vez de .g.dart

Adicione uma diretiva de parte para incluir o arquivo RealmObject que você gerou na etapa 4 no mesmo pacote do arquivo em que está trabalhando no momento.

schemas.dart
part 'schemas.realm.dart';
3

Crie o modelo para seu esquema de Realm . Você deve incluir a anotação RealmModel na parte superior da definição da classe .

Você utilizará o RealmModel para gerar o RealmObject público utilizado em todo o aplicativo na etapa 4.

Você pode tornar o modelo privado ou público. Recomendamos tornar todos os modelos privados e defini-los em um único arquivo. Anexe o nome da classe com um sublinhado (_) para torná-lo privado.

Se você precisar definir seu esquema em vários arquivos, poderá tornar o RealmModel público. Anexe o nome com um cifrão ($) para tornar o modelo público. Você deve fazer isso para gerar o RealmObject a partir do RealmModel, conforme descrito na etapa 4.

Adicione campos ao RealmModel. Você pode adicionar todos os tipos de dados suportados. Inclua comportamentos adicionais usando anotações de propriedade.

schemas.dart
@RealmModel()
class _Car {
@PrimaryKey()
late ObjectId id;
late String make;
late String? model;
late int? miles;
}

Observação

Os nomes das classes têm um limite máximo de 57 caracteres UTF-8.

4

Alterado na versão v2.0.0: Os arquivos gerados são nomeados .realm.dart em vez de .g.dart

Gere o RealmObject, que você utilizará em seu aplicativo:

dart run realm generate
dart run realm_dart generate

Este comando gera o arquivo no mesmo diretório que seu arquivo de modelo. Tem o nome que especificou na parte diretiva do passo 2.

Dica

Rastrear o arquivo gerado

Rastreie o arquivo gerado em seu sistema de controle de versão, como git.

Exemplo

Estrutura de arquivo após gerar modelo

.
├── schemas.dart
├── schemas.realm.dart // newly generated file
├── myapp.dart
└── ...rest of application
5

Utilize o RealmObject que você gerou na etapa anterior em seu aplicativo. Como você incluiu o arquivo gerado como parte do mesmo pacote onde você definiu o RealmModel na etapa 2, acesse o RealmObject importando o arquivo com o RealmModel.

myapp.dart
import './schemas.dart';
final hondaCivic = Car(ObjectId(), 'Honda', model: 'Civic', miles: 99);

Um Esquema do App Services é uma lista de esquemas de objeto válidos que cada um define um tipo de objeto que um Aplicativo pode persistir. Todos os objetos sincronizados em um domínio devem estar em conformidade com o esquema do App Services.

Os aplicativos do cliente fornecem um Esquema de objetos quando abrem um domínio. Se um domínio já contiver dados, ele já terá um esquema e, quando for aberto, o Realm validará o esquema no cliente em relação ao esquema existente.

Você pode definir Esquemas do App Services das seguintes maneiras:

  • Automaticamente com o esquema de objeto se o modo de desenvolvimento estiver habilitado.

  • Defina explicitamente o esquema do App Services com o App Services.

Em seu esquema, você deve usar a anotação MapTo("_id") com sua chave primária no RealmModel para sincronizar com êxito seu esquema de objetos com o App Services.

@RealmModel()
class _SyncSchema {
@PrimaryKey()
@MapTo("_id")
late ObjectId id;
// ... other properties
}

Para obter mais informações sobre como definir seu esquema e quais dessas abordagens você deve considerar para seu aplicativo, consulte a documentação Criar um esquema Realm.

Os esquemas do Realm suportam muitos tipos de dados da linguagem DART, além de alguns tipos específicos do Realm. Para uma referência abrangente de todos os tipos de dados suportados, consulte Tipos de dados.

Use anotações para adicionar funcionalidade às propriedades em seus modelos de objeto do Realm. Você pode usar anotações para coisas como marcar uma propriedade como anulável, definir uma chave primária, ignorar uma propriedade e muito mais. Para saber mais sobre as anotações de propriedade disponíveis, consulte Anotações de propriedade.

Você pode definir relações entre objetos de Realm em seu esquema. O Realm SDK Flutter oferece suporte a relacionamentos do tipo um para um, muitos para muitos, relacionamentos inversos e incorporação de objetos em outros objetos. Para saber mais sobre como definir relacionamentos em seu esquema de objetos de Realm, consulte Relacionamentos.

Você pode usar a anotação MapTo para mapear um modelo de objeto ou propriedade Realm para um nome armazenado diferente em Realm. Isto pode ser útil nos seguintes cenários. Por exemplo:

  • Para facilitar o trabalho em plataformas onde as convenções de nomenclatura são diferentes. Por exemplo, se os nomes das propriedades do esquema Device Sync usarem snake case, enquanto seu projeto usa camel case.

  • Para alterar um nome de campo ou classe sem forçar uma migração.

  • Para oferecer suporte a várias classes de modelo com o mesmo nome em pacotes diferentes.

  • Para usar um nome de classe maior que o limite de 57 caracteres imposto pelo Realm.

Se você estiver usando o Atlas Device Sync, o nome especificado na anotação MapTo será usado como o nome persistente do esquema do App Services.

@RealmModel()
@MapTo('naval_ship')
class _Boat {
@PrimaryKey()
late ObjectId id;
late String name;
late int? maxKnots;
late int? nauticalMiles;
}
class _Vehicle {
@PrimaryKey()
late ObjectId id;
late String? maybeDescription; // optional value
late double milesTravelled = 0; // 0 is default value
@Ignored()
late String notInRealmModel;
@Indexed()
late String make;
@MapTo('wheels') // 'wheels' is property name in the RealmObject
late int numberOfWheels;
}

Novidades na versão 2.0.0.

A partir do Flutter SDK versão 2.0.0, você pode armazenar collections de dados mistos dentro de uma propriedade RealmValue . Você pode usar esse recurso para modelar estruturas de dados complexas, como documentos JSON ou MongoDB , sem precisar definir um modelo de dados rigoroso.

Dados não estruturados são dados que não estão em conformidade com facilmente um esquema esperado, tornando difícil ou impraticável modelar classes de dados individuais. Por exemplo, seu aplicativo pode ter dados altamente variáveis ou dados dinâmicos cuja estrutura é desconhecida no tempo de execução.

O armazenamento de coleções em uma propriedade mista oferece flexibilidade sem sacrificar a funcionalidade, incluindo sincronização de desempenho ao usar o Device Sync. E você pode trabalhar com eles da mesma forma que faria com uma collection não mista:

  • Você pode aninhar collections mistas em até 100 níveis.

  • Você pode consultar e React a alterações em coleções mistas.

  • Você pode localizar e atualizar elementos individuais de coleção mista.

No entanto, armazenar dados em coleções mistas é menos eficiente do que usar um esquema estruturado ou serializar blobs JSON em uma única propriedade de string.

Para modelar dados não estruturados em seu aplicativo, defina as propriedades apropriadas em seu esquema como tipos de RealmValue . Você pode então definir essas propriedades RealmValue como uma coleção RealmList ou RealmMap de RealmValue elementos. Observe que RealmValue não pode representar um RealmSet ou um objeto incorporado.

Por exemplo , você pode utilizar um RealmValue que contém um mapa de dados mistos ao modelar um objeto de log de evento variável:

modelo de dados
// Define class with a `RealmValue` property
@RealmModel()
class _EventLog {
@PrimaryKey()
late ObjectId id;
late String eventType;
late DateTime timestamp;
late String userId;
late RealmValue details;
}
Criar dados não estruturados
realm.write(() {
// Add `eventLog` property data as a map of mixed data, which
// also includes nested lists of mixed data
realm.add(EventLog(ObjectId(), 'purchase', DateTime.now(), 'user123',
details: RealmValue.from({
'ipAddress': '192.168.1.1',
'items': [
{'id': 1, 'name': 'Laptop', 'price': 1200.00},
{'id': 2, 'name': 'Mouse', 'price': 49.99}
],
'total': 1249.99
})));
final eventLog = realm.all<EventLog>().first;
final items = eventLog.details.asMap();
print('''
Event Type: ${eventLog.eventType}
Timestamp: ${eventLog.timestamp}
User ID: ${eventLog.userId}
Details:
Item:
''');
for (var item in items.entries) {
print('${item.key}: ${item.value}');
}
Event Type: purchase
Timestamp: 2024-03-18 13:50:58.402979Z
User ID: user123
Details:
Item:
ipAddress: RealmValue(192.168.1.1)
items: RealmValue([RealmValue({id: RealmValue(1), name: RealmValue(Laptop), price: RealmValue(1200.0)}), RealmValue({id: RealmValue(2), name: RealmValue(Mouse), price: RealmValue(49.99)})])
total: RealmValue(1249.99)

Dica

  • Use um mapa de tipos de dados mistos quando o tipo for desconhecido, mas cada valor terá um identificador exclusivo.

  • Use uma lista de tipos de dados mistos quando o tipo for desconhecido, mas a ordem dos objetos for significativa.

Alterado na versão v2.0.0: Os arquivos gerados são nomeados .realm.dart em vez de .g.dart

Depois de concluir o modelo Realm, você deve gerar a classe RealmObject para usá-la em seu aplicativo.

Execute o seguinte comando para gerar RealmObjects:

dart run realm generate
dart run realm_dart generate

Executar isto cria uma classe pública em um novo arquivo no diretório onde você definiu a classe RealmModel de acordo com a seção Criar Modelo.

O arquivo gerado tem o mesmo nome de base que o arquivo com seu RealmModel, terminando com .realm.dart. Por exemplo, se o arquivo com seu RealmModel for denominado schemas.dart, o arquivo gerado será schemas.realm.dart.

Observação

Lembre-se de incluir o arquivo gerado em uma diretiva de parte em seu arquivo de definição do RealmModel.

schemas.dart
// ...import packages
part 'schemas.realm.dart';
@RealmModel()
// ...model definition

Se quiser observar seus modelos de dados para gerar RealmObjects sempre que houver uma alteração, inclua o sinalizador --watch em seu comando.

dart run realm generate --watch
dart run realm_dart generate --watch

Para limpar os caches do gerador, inclua a bandeira --clean no seu comando. Limpar o cache do gerador pode ser útil ao depurar.

dart run realm generate --clean
dart run realm_dart generate --clean

Novidades na versão 1.5.0.

Objetos assimétricos exigem Flexible Sync. Para definir um objeto assimétrico, passe ObjectType.asymmetricObject para @RealmModel().

@RealmModel(ObjectType.asymmetricObject)
class _WeatherSensor {
@PrimaryKey()
@MapTo("_id")
late ObjectId id;
late String deviceId;
late double modtemperatureInFahrenheitel;
late double barometricPressureInHg;
late double windSpeedInMph;
}

Nas versões 1.5.0 e anteriores do SDK Flutter, você não pode vincular de asymmetricObject tipos a RealmObjects. Nas versões 1.6.0 e posteriores do SDK, os tipos asymmetricObject podem ser vinculados a RealmObjects, além dos tipos de objetos incorporados.

Observação

Tentando ler objetos assimétricos

Não é possível ler objetos assimétricos. Se você tentar executar queries de um objeto assimétrico, receberá o seguinte erro: "Erro: Não é possível executar queries de classes assimétricas.".

Para mais informações sobre ingestão de dados, consulte Stream Data to Atlas.

Voltar

Dados do modelo