Menu Docs

Página inicial do DocsDesenvolver aplicaçõesAtlas Device SDKs

Tipos de dados - Flutter SDK

Nesta página

  • Tipos de Dart
  • DateTime
  • Referência de objetos do Realm
  • Collections
  • Lista de domínios
  • RealmSet
  • RealmMap
  • RealmResults
  • As coleções estão ativas
  • Tipos de dados adicionais suportados
  • ObjectId
  • UUID
  • Decimal128
  • RealmValue
  • Uint8List
  • Objetos embarcados
  • Exemplo

O Flutter SDK suporta tipos de dados de linguagem de gráfico, um subconjunto limitado de BSON tipos e UUID.

Para saber como tipos de dados específicos são mapeados para tipos BSON em um Esquema de Serviços de Aplicativo, consulte Mapeamento de Modelo de Dados na documentação de Serviços de Aplicativo do Atlas.

O Realm é compatível com os seguintes tipos de Dart:

  • int

  • double

  • bool

  • String

  • DateTime

Ao utilizar o DateTime com o Realm Flutter SDK, você pode declará-lo no modelo como faria com qualquer outro tipo de Dart:

@RealmModel()
class _Vehicle {
@PrimaryKey()
late ObjectId id;
late String nickname;
late DateTime dateLastServiced;
}

No entanto, é importante observar que o Realm armazena DateTime em UTC. Ao utilizar o DateTime, você deve criá-lo em UTC ou convertê-lo com .toUtc() antes de armazená-lo. Se seu aplicativo exigir, você poderá convertê-lo novamente para o fuso horário local ou desejado ao ler do Realm.

// Create a Realm object with date in UTC, or convert with .toUtc() before storing
final subaruOutback = realm.write<Vehicle>(() {
return realm.add(
Vehicle(ObjectId(), 'Subie', DateTime.utc(2022, 9, 18, 12, 30, 0)));
});
final fordFusion =
Vehicle(ObjectId(), 'Fuse', DateTime(2022, 9, 18, 8, 30, 0).toUtc());
realm.write(() {
realm.add(fordFusion);
});
// When you query the object, the `DateTime` returned is UTC
final queriedSubaruOutback =
realm.all<Vehicle>().query('nickname == "Subie"')[0];
// If your app needs it, convert it to Local() or the desired time zone
final localizedSubieDateLastServiced =
queriedSubaruOutback.dateLastServiced.toLocal();

Você também pode fazer referência a um ou mais objetos Realm de outro. Saiba mais na documentação de propriedades de relacionamento.

Uma collection de Realm contém zero ou mais instâncias de um tipo de dados compatível com Realm. Em uma collection Realm, todos os objetos em uma collection são do mesmo tipo.

Você pode filtrar e classificar qualquer coleção usando a linguagem de consulta do domínio. As coleções são objetos ativos, portanto, sempre refletem o estado atual da instância do domínio. O conteúdo de uma coleção é atualizado quando novos elementos são adicionados ou excluídos da coleção ou de seu domínio.

Você também pode ouvir as alterações na coleção assinando as notificações de alteração.

O Realm tem os seguintes tipos de coleções:

Objetos de Realm podem conter listas de qualquer tipo de dados suportado. O Realm usa a RealmList tipo de dados para armazenar os dados.

Quando você inclui RealmObjects como os itens em um RealmList, ele representa um relacionamento para muitos.

Excluir um objeto do banco de dados o removerá de qualquer RealmLists em que ele estava presente. Portanto, um RealmList de RealmObject tipos nunca conterão valores nulos. Além disso, um RealmList pode conter múltiplas referências para o mesmo RealmObject.

Um RealmList de tipos primitivos pode conter valores nulos. Se você não quiser permitir valores nulos em uma lista, use tipos não anuláveis na declaração da lista (por exemplo, use List<int> em vez de List<int?>).

Um RealmList é mutável e você pode adicionar e remover elementos em um RealmList dentro de uma transação de escrita.

Você pode adicionar um RealmList ao seu esquema de objetos definindo uma propriedade como tipo List<T> , em que T pode ser qualquer tipo de dados Realm suportado (exceto outras collections), em seu Realm Object Model.

@RealmModel()
class _Player {
@PrimaryKey()
late ObjectId id;
late String username;
// `inventory` property of type RealmList<Item>
// where Items are other RealmObjects
late List<_Item> inventory;
// `traits` property of type RealmList<String>
// where traits are Dart Strings.
late List<String> traits;
}
@RealmModel()
class _Item {
@PrimaryKey()
late ObjectId id;
late String name;
late String description;
}

Alterado na versão 2.0.0: Obtenha RealmList pelo nome da propriedade com dynamic.getList()

O exemplo seguinte demonstra algum uso básico do RealmList. Para obter mais informações sobre todos os métodos disponíveis, consulte a referência RealmList documentação.

final artemis =
realm.write(() => realm.add(Player(ObjectId(), 'Art3mis', inventory: [
Item(ObjectId(), 'elvish sword', 'sword forged by elves'),
Item(ObjectId(), 'body armor', 'protects player from damage'),
], traits: [
'brave',
'kind'
])));
// Get a RealmList by property name with dynamic.getList()
final inventory = artemis.dynamic.getList('inventory');
// Use RealmList methods to filter results
RealmList<String> traits = artemis.traits;
final brave = traits.firstWhere((element) => element == 'brave');
final elvishSword =
artemis.inventory.where((item) => item.name == 'elvish sword').first;
// Query RealmList with Realm Query Language
final playersWithBodyArmor =
realm.query<Player>("inventory.name == \$0", ['body armor']);
print("LEN ${playersWithBodyArmor.length}");

Objetos de Realm podem conter conjuntos de qualquer tipo de dados suportado, exceto outra collection. O Realm usa o RealmSet tipo de dados para armazenar os dados. Em uma RealmSet collection , todos os valores são únicos. RealmSet estende o conjunto de dart nativo tipo de dados com propriedades e métodos adicionais específicos do Realm.

Quando você inclui RealmObjects como os itens em um RealmSet, ele representa um relacionamento para muitos.

Um RealmSet é mutável e você pode adicionar e remover elementos em um RealmSet dentro de uma transação de escrita.

Você pode adicionar um RealmSet ao seu esquema de objetos definindo uma propriedade como tipo Set<T> , em que T pode ser qualquer tipo de dados Realm suportado, exceto outras collections, em seu Realm Object Model.

Ao definir um RealmSet em um esquema:

  • Um conjunto de tipos primitivos pode ser definido como anulável ou não anulável. Por exemplo, Set<int> e Set<int?> são válidos em um esquema de Realm.

  • Um conjunto de tipos RealmObject e RealmValue pode ser somente não anulável. Por exemplo Set<RealmValue> é válido, mas Set<RealmValue?> não é válido.

  • Você não pode definir valores padrão ao definir um conjunto em um esquema. Por exemplo, Set mySet = {0,1,2} não é válido.

@RealmModel()
class _RealmSetExample {
late Set<String> primitiveSet;
late Set<int?> nullablePrimitiveSet;
late Set<_SomeRealmModel> realmObjectSet;
}
@RealmModel()
class _SomeRealmModel {
late ObjectId id;
}

Alterado na versão 2.0.0: Obtenha RealmSet pelo nome da propriedade com dynamic.getSet()

O exemplo seguinte demonstra algum uso básico do RealmSet. Para obter mais informações sobre todos os métodos disponíveis, consulte a referência do RealmSet documentação.

final realm = Realm(
Configuration.local([RealmSetExample.schema, SomeRealmModel.schema]));
// Pass native Dart Sets to the object to create RealmSets
final setExample = RealmSetExample(
primitiveSet: {'apple', 'pear'},
nullablePrimitiveSet: {null, 2, 3},
realmObjectSet: {SomeRealmModel(ObjectId())});
// Add RealmObject to database
realm.write(() => realm.add(setExample));
// Once you add the sets, they are of type RealmSet
RealmSet primitiveSet = setExample.primitiveSet;
// Modify RealmSets of RealmObjects in write transactions
realm.write(() {
// Add element to a RealmSet with RealmSet.add()
setExample.realmObjectSet.add(SomeRealmModel(ObjectId()));
// Remove element from a RealmSet with RealmSet.remove()
setExample.primitiveSet.remove('pear');
});
// Check if a RealmSet contains an element with RealmSet.contains()
if (setExample.primitiveSet.contains('apple')) {
print('Set contains an apple');
}
// Get RealmSet by property name with dynamic.getSet()
final getSetResult = setExample.dynamic.getSet('primitiveSet');
// Check number of elements in a RealmSet with RealmSet.length
print(
'Set now has ${getSetResult.length} elements'); // Prints 'Set now has 1 elements'
// Query RealmSets using Realm Query Language
final results =
realm.query<RealmSetExample>('\$0 IN nullablePrimitiveSet', [null]);

Novidades na versão 1.7.0.

RealmMap é uma coleção que contém pares de valores-chave de <String, T>, onde T é qualquer tipo de dados suportado pelo SDK. As chaves de mapa não podem conter . ou começar com , a $ menos que você use codificação percentual.

Um RealmMap é mutável e você pode adicionar e remover elementos em um RealmMap dentro de uma transação de escrita. Você pode ouvir as alterações de entrada do RealmMap usando um ouvinte de alterações.

Você pode adicionar um RealmMap ao seu esquema de objetos definindo uma propriedade como tipo RealmMap<String, T> , em que T pode ser qualquer tipo de dados Realm suportado (exceto outras collections), em seu Realm Object Model.

@RealmModel()
class _MapExample {
late Map<String, int> map;
late Map<String, int?> nullableMap;
}

Alterado na versão 2.0.0: Obtenha RealmMap pelo nome da propriedade com dynamic.getMap()

O exemplo seguinte demonstra algum uso básico do RealmMap. Para obter mais informações sobre todos os métodos disponíveis, consulte a referência do RealmMap documentação.

final realm = Realm(Configuration.local([MapExample.schema]));
// Pass native Dart Maps to the object to create RealmMaps
final mapExample = MapExample(
map: {
'first': 1,
'second': 2,
'third': 3,
},
nullableMap: {
'first': null,
'second': 2,
'third': null,
},
);
// Add RealmObject to the database
realm.write(() => realm.add(mapExample));
// Once you add maps, they are of type RealmMap
RealmMap map = mapExample.map;
// Modify RealmMaps in write transactions
realm.write(() {
// Update value by key with .update() or [value] = newValue
mapExample.nullableMap['second'] = null;
mapExample.map.update('first', (value) => 5);
mapExample.nullableMap.update('fourth', (v) => 4, ifAbsent: () => null);
// Add a new map entry with .addEntries()
const newMap = {'fourth': 4};
mapExample.map.addEntries(newMap.entries);
});
// Check a RealmMap with .containsKey() or .containsValue()
if (mapExample.map.containsKey('first')) {
print('Map contains key "first"');
} else if (mapExample.map.containsValue(null)) {
print('Map contains null value');
} else {
print('These aren\'t the maps you\'re looking for');
}
// Get a RealmMap by property name with dynamic.getMap()
final getPrimitiveMap = mapExample.dynamic.getMap('map');
// Check the number of elements in a RealmMap with RealmMap.length
print(
'Map contains ${getPrimitiveMap.length} elements'); // Prints 'Map contains 4 elements'
// Query RealmMaps using Realm Query Language
final results = realm.query<MapExample>('map.first == \$0', [5]);

Um RealmResults collection representa os resultados avaliados displicentemente de uma operação de query. Ao contrário de um RealmList, os resultados são imutáveis: você não pode adicionar ou remover elementos na collection de resultados. Isso ocorre porque o conteúdo de uma collection de resultados é determinado por uma query para banco de dados.

Realm.all() e Realm.query() retornam RealmResults. Para mais informações sobre como fazer queries no Realm, consulte Operações de leitura.

RealmResults<Player> players = realm.all<Player>();
RealmResults<Player> bravePlayers =
realm.query<Player>('ANY traits == \$0', ['brave']);

O Realm só realiza uma query quando você realmente solicita os resultados dessa query, por exemplo, acessando elementos da coleção de resultados. Com essa avaliação preguiçosa, você consegue escrever um código elegante e de alto desempenho para lidar com grandes conjuntos de dados e queries complexas.

Assim como os objetos ativos, as coleções de Realm geralmente são ativas:

  • As collection de resultados ativas sempre refletem os resultados atuais da query associada.

  • As listas ativas de RealmObjects sempre refletem o estado atual do relacionamento na Instância de Realm.

No entanto, há dois casos em que uma collection não está ativa:

  • A coleção não é gerenciada: uma propriedade RealmList de um objeto Realm que ainda não foi adicionado a um realm ou que foi copiado de um realm.

  • A coleção está congelada.

Combinado com a monitorização de alterações em uma coleção, as coleções dinâmicas permitem um código mais organizado e responsivo. Por exemplo, suponha que sua visualização exiba os resultados de uma consulta. Você pode manter uma referência à coleção de resultados em sua classe de exibição e, em seguida, ler a coleção de resultados conforme necessário sem precisar atualizá-la ou validar se ela está atualizada.

Importante

Os índices podem mudar

Como os resultados se atualizam automaticamente, não armazene o índice posicional de um objeto na coleção ou a contagem de objetos em uma coleção. O índice armazenado ou o valor de contagem podem estar desatualizados no momento em que você o utiliza.

O ObjectId é um valor exclusivo de 12 bytes específico do MongoDB que você pode usar como identificador para objetos. O ObjectId é indexável e pode ser usado como chave primária.

Para definir uma propriedade como um ObjectId, defina seu tipo como ObjectId em seu modelo de objeto.

@RealmModel()
class _ObjectIdPrimaryKey {
@PrimaryKey()
late ObjectId id;
}

Chame a função ObjectId() para definir quaisquer propriedades de identificador exclusivas do seu objeto. Como alternativa, passe uma string para ObjectId() para definir a propriedade de identificador exclusivo como um valor específico.

final id = ObjectId();
final object = ObjectIdPrimaryKey(id);

UUID (Universal Unique Identifier) é um 16 valor único de bytes . Você pode usar um UUID como identificador para objetos. Os UUIDs são indexáveis e você pode usá-los como chaves primárias.

Observação

Uso de UUID em vez de ObjectId

Em geral, você pode usar UUID para quaisquer campos que funcionem como um identificador único. Usar UUID pode ser particularmente útil se você estiver migrando dados não armazenados no MongoDB, pois é provável que os identificadores exclusivos do seu objeto já sejam do tipo UUID. Por outro lado, usar ObjectId pode ser útil para uma coleção de dados que já existe no MongoDB.

Para definir uma propriedade como UUID, defina seu tipo como Uuid em seu modelo de objeto.

@RealmModel()
class _UuidPrimaryKey {
@PrimaryKey()
late Uuid id;
}

Para definir qualquer propriedade de identificador exclusivo do seu objeto com um valor aleatório, chame um dos métodos Uuid para criar um UUID, como Uuid.v4().

final myId = Uuid.v4();
final object = UuidPrimaryKey(myId);

O Dart não tem um tipo decimal nativo. Você pode usar decimal128, que é uma 128implementação de bits do IEEE-754. Ao definir um tipo de decimal, utilize o Decimal128 tipo BSON.

Ao usar Decimal128, esteja ciente de que o método Dart compareTo() implementa uma ordem total que imita o tipo Dart double . Isto significa que os seguintes fatores são verdadeiros ao utilizar o compareTo():

  • Todos os valores de NaN são considerados iguais e maiores que qualquer valor numérico.

  • -Decimal128.zero é menor que Decimal128.zero (e o número inteiro 0), mas maior que qualquer valor negativo diferente de zero.

  • O infinito negativo é menor que todos os outros valores e o infinito positivo é maior que todos os valores não NaN.

  • Todos os outros valores são comparados usando seu valor numérico.

Importante

Flutter SDK v2.0.0 Alterações no RealmValue

Flutter SDK versão 2.0.0 atualiza o RealmValue para permitir um tipo List ou Map de RealmValue, o que permite mais flexibilidade ao modelar dados não estruturados. Consulte Dados não estruturados do modelo para obter mais informações.

Esta atualização também inclui a seguinte alteração interruptiva, que podem afetar seu aplicativo quando a atualização para a versão2.0.0 ou posterior:

  • RealmValue.type agora é uma enumeração de RealmValueType em vez de Type.

  • RealmValue.uint8List foi renomeado para RealmValue.binary.

Para obter mais informações sobre como atualizar um aplicativo existente de uma versão anterior para a v2.0.0 ou posterior, consulte Atualizar para o Flutter SDK v2.0.0.

O RealmValue tipo de dados é um tipo de dados misto que pode representar qualquer outro tipo de dados válido, exceto objetos embarcados. No Flutter SDK v2.0.0 e posterior, RealmValue pode representar um List<RealmValue> ou Map<String, RealmValue>.

Para definir uma propriedade RealmValue, defina seu tipo no modelo de objetos. RealmValue é indexável, mas não pode ser uma chave primária. Você também pode definir propriedades como collection (listas, conjuntos ou mapas) do tipo RealmValue.

@RealmModel()
class _RealmValueExample {
@Indexed()
late RealmValue singleAnyValue;
late List<RealmValue> listOfMixedAnyValues;
late Set<RealmValue> setOfMixedAnyValues;
late Map<String, RealmValue> mapOfMixedAnyValues;
}

Observação

RealmValue não é anulável, mas pode conter valores nulos

Ao definir seu esquema de objeto Realm, você não pode criar um RealmValue anulável. No entanto, se você desejar que uma propriedade RealmValue contenha um valor nulo, você poderá utilizar a propriedade RealmValue.nullValue() especial.

Para adicionar um RealmValue a um Objeto de Realm, chame RealmValue.from() nos dados ou RealmValue.nullValue() para definir um valor nulo.

final realm = Realm(Configuration.local([RealmValueExample.schema]));
realm.write(() {
// Use 'RealmValue.from()' to set values
var anyValue = realm.add(RealmValueExample(
// Add a single `RealmValue` value
singleAnyValue: RealmValue.from(1),
// Add a list of `RealmValue` values
listOfMixedAnyValues: [Uuid.v4(), 'abc', 123].map(RealmValue.from),
// Add a set of `RealmValue` values
setOfMixedAnyValues: {
RealmValue.from('abc'),
RealmValue.from('def')
},
// Add a map of string keys and `RealmValue` values
mapOfMixedAnyValues: {
'1': RealmValue.from(123),
'2': RealmValue.from('abc')
}));
// Use 'RealmValue.nullValue()' to set null values
var anyValueNull = realm.add(RealmValueExample(
singleAnyValue: RealmValue.nullValue(),
listOfMixedAnyValues: [null, null].map(RealmValue.from),
setOfMixedAnyValues: {RealmValue.nullValue()},
mapOfMixedAnyValues: {'null': RealmValue.nullValue()}));

Alterado na versão 2.0.0: a enumeração RealmValueType substitui RealmValue.type. RealmValue.binary substitui RealmValue.uint8List.

Para acessar os dados armazenados em um RealmValue, você pode utilizar:

  • RealmValue.value, que retorna um Object?.

  • RealmValue.as<T>, que busca os dados e os converte em um tipo desejado.

for (var obj in data) {
for (var mixedValue in obj.listOfMixedAnyValues) {
// Use RealmValue.value to access the value
final value = mixedValue.value;
if (value is int) {
sum = sum + value;
} else if (value is String) {
combinedStrings += value;
}
// Use RealmValue.as<T> to cast value to a specific type
try {
final intValue = mixedValue.as<int>();
sum = sum + intValue;
} catch (e) {
log('Error casting value to int: $e');
}
}
}

Você pode verificar o tipo de dados atualmente armazenados em uma propriedade RealmValue acessando a propriedade type. Começando com o Flutter SDK v2.0.0, retorna uma enumeração RealmValueType. Em versões anteriores do SDK, o SDK retornou um RealmValue.value.runtimeType.

O exemplo seguinte utiliza RealmValueType para executar cálculos baseados no tipo de dados.

final data = realm.all<RealmValueExample>();
for (var obj in data) {
final anyValue = obj.singleAnyValue;
// Access the RealmValue.type property
switch (anyValue.type) {
// Work with the returned RealmValueType enums
case RealmValueType.int:
approximateAge = DateTime.now().year - anyValue.as<int>();
break;
case RealmValueType.dateTime:
approximateAge =
(DateTime.now().difference(anyValue.as<DateTime>()).inDays /
365)
.floor();
break;
case RealmValueType.string:
final birthday = DateTime.parse(anyValue.as<String>());
approximateAge =
(DateTime.now().difference(birthday).inDays / 365).floor();
break;
// Handle other possible types ...
default:
log('Unhandled type: ${anyValue.type}');
}
}

Novidades na versão v2.0.0.

Começando com o Flutter SDK v2.0.0, um tipo de dados RealmValue pode conter collection (uma lista ou mapa, mas não um conjunto) de elementos RealmValue .

Estas collection de dados mistos podem ser aninhadas e conter outras collection. Eles também podem ser escutados para mudanças como uma collection normal.

Você pode aproveitar essas collection aninhadas para definir dados não estruturados ou variáveis em seu Modelo de dados Realm. Para obter mais informações, consulte Modelar dados não estruturados.

Para criar collection aninhadas de dados mistos em seu aplicativo, defina a propriedade de tipo misto em seu Modelo de dados Realm da mesma forma que faria com qualquer outro tipo RealmValue . Em seguida, você pode criar a lista ou coleções de mapas utilizando RealmValue.from().

realm.write(() {
realm.add(RealmValueCollectionExample(
// Set the RealmValue as a map of mixed data
singleAnyValue: RealmValue.from({
'int': 1,
// You can nest RealmValues in collections
'listOfInt': [2, 3, 4],
'mapOfStrings': {'1': 'first', '2': 'second'},
// You can also nest collections within collections
'mapOfMaps': [
{
'nestedMap_1': {'1': 1, '2': 2},
'nestedMap_2': {'3': 3, '4': 4}
}
],
'listOfMaps': [
{
'nestedList_1': [1, 2, 3],
'nestedList_2': [4, 5, 6]
}
]
})));

8Lista de Uint é um tipo de dados binários de dart:typed_data. Você pode usar esse tipo de dados em modelos de objeto e valores de propriedade.

Para definir uma propriedade como Uint8List, você deve primeiro importar dart:typed_data. Em seguida, defina o tipo de objeto como Uint8List no seu modelo de objeto.

@RealmModel()
class _BinaryExample {
late String name;
late Uint8List requiredBinaryProperty;
late Uint8List? nullableBinaryProperty;
}

Para adicionar Uint8List a um objeto de Realm, chame Uint8List.fromList() nos dados.

final realm = Realm(Configuration.local([BinaryExample.schema]));
realm.write(() {
realm.addAll([
BinaryExample("Example binary object", Uint8List.fromList([1, 2]))
]);
});

O Realm trata cada objeto incorporado como dados aninhados dentro de um objeto pai. Um objeto incorporado herda o ciclo de vida de seu objeto pai. Não pode existir como um objeto de Realm independente. Objetos incorporados têm as seguintes propriedades:

  • Objetos incorporados são excluídos quando o objeto pai é excluído ou o pai não faz referência a eles.

  • Não é possível reatribuir um objeto incorporado a outro objeto pai.

  • não é possível vincular a um objeto incorporado a partir de vários objetos pai.

  • Você só pode fazer consulta de um objeto incorporado acessando-o por meio de seu objeto pai.

Declare um objeto embarcado passando ObjectType.embeddedObject à @RealmModel() anotação . Objetos embarcados devem ser anuláveis ao defini-los no do objeto RealmModel pai. Você também deve incluir o esquema do objeto embarcado na configuração do realm.

O exemplo a seguir mostra como modelar um objeto incorporado em um esquema do Realm. O modelo _Address está incorporado dentro do modelo _Person.

// The generated `Address` class is an embedded object.
@RealmModel(ObjectType.embeddedObject)
class _Address {
late String street;
late String city;
late String state;
late String country;
}
@RealmModel()
class _Person {
@PrimaryKey()
late ObjectId id;
late String name;
// Embedded object in parent object schema
late _Address? address; // Must be nullable
}

Você pode usar o pai propriedade para acessar o pai do objeto incorporado.

O exemplo a seguir destaca considerações específicas ao lidar com objetos incorporados. O exemplo utiliza o objeto incorporado Address gerado a partir do RealmModel _Address no esquema acima.

// Both parent and embedded objects in schema
final realm = Realm(Configuration.local([Person.schema, Address.schema]));
// Create an embedded object.
final joesHome = Address("500 Dean Street", "Brooklyn", "NY", "USA");
final joePrimaryKey = ObjectId();
final joe = Person(joePrimaryKey, "Joe", address: joesHome);
realm.write(() => realm.add(joe));
// Update an embedded object property.
realm.write(() {
joe.address?.street = "800 Park Place";
});
// Query a collection of embedded objects.
// You must access the embedded object through the parent RealmObject type.
final peopleWithNewYorkHomes = realm.query<Person>("address.state = 'NY'");
// Overwrite an embedded object.
// Also deletes original embedded object from realm.
final joesNewHome = Address("12 Maple Way", "Toronto", "ON", "Canada");
realm.write(() {
joe.address = joesNewHome;
});
// You can access the parent object from an embedded object.
final thePersonObject = joesNewHome.parent;
// Delete embedded object from parent object.
realm.write(() => realm.delete(joe.address!));
// Add address back for the following example.
final anotherNewHome = Address("202 Coconut Court", "Miami", "FL", "USA");
realm.write(() {
joe.address = anotherNewHome;
});
// Deleting the parent object also deletes the embedded object.
realm.write(() => realm.delete(joe));

O modelo seguinte inclui alguns tipos de dados suportados.

part 'car.realm.dart';
// The generated `Address` class is an embedded object.
@RealmModel(ObjectType.embeddedObject)
class _Address {
late String street;
late String city;
late String state;
late String country;
}
@RealmModel()
class _Person {
@PrimaryKey()
late ObjectId id;
late String name;
// Embedded object in parent object schema
late _Address? address; // Must be nullable
}
@RealmModel()
class _Car {
@PrimaryKey()
late ObjectId id;
String? licensePlate;
bool isElectric = false;
double milesDriven = 0;
late List<String> attributes;
late _Person? owner;
}
← Definir um esquema de objeto Realm - Flutter SDK