Alterado na versão realm@12.9.0: Propriedades mistas podem conter listas ou dicionários de dados mistos.
Novidades na versão realm@10.5.0.
O tipo de dados misto é um tipo de propriedade Realm que pode conter qualquer tipo de dados Realm válido, exceto um objeto incorporado ou um conjunto. Você pode criar collections (listas, conjuntos e dicionários) do tipo mixed. Propriedades que usam o tipo de dados misto também podem conter valores nulos.
O tipo Misto é indexável, mas você não pode usá-lo como chave primária.
As propriedades que usam o tipo Misto podem conter valores nulos e não podem ser definidas como opcionais. Todas as instâncias do tipo JavaScript Number em um tipo Realm Misto são mapeadas para o tipo Realm double .
Realm Object Models
Para definir uma propriedade do seu Realm Object Model como Misto, defina o tipo da propriedade como mixed.
class Cat extends Realm.Object { static schema = { name: 'Cat', properties: { name: 'string', birthDate: 'mixed', }, }; }
class Cat extends Realm.Object<Cat> { name!: string; birthDate?: Realm.Mixed; static schema: ObjectSchema = { name: 'Cat', properties: { name: 'string', birthDate: 'mixed', }, }; }
Coleções como mistas
No JavaScript SDK v12.9.0 e posterior, um tipo de dados misto pode conter collections (uma lista ou dicionário, mas não um conjunto) de elementos mistos. Você pode usar collections mistas para modelar dados não estruturados ou variáveis. Para mais informações, consulte Definir Dados Não Estruturados.
Você pode aninhar collections mistas em até 100 níveis.
Você pode consultar propriedades de collections mistas e registrar um ouvinte para alterações, como faria com uma collection normal.
Você pode encontrar e atualizar elementos individuais de collections mistas
Você não pode armazenar conjuntos ou objetos incorporados em coleções mistas.
Para utilizar coleções mistas, defina a propriedade de tipo misto no seu modelo de dados. Em seguida, crie a lista ou coleção de dicionário.
Criar um objeto com um valor misto
Crie um objeto com um valor misto usando o operador dentro de uma transação de gravação.
Exemplo
No exemplo CreateCatsInput seguinte, criamos vários Objeto de Realm Cat com um tipo Misto para o campo birthDate .
O componente CreateCatsInput faz o seguinte:
Obter acesso a uma instância de realm aberta chamando a função hook
useRealm().Use o gancho useEffect da React para chamar uma função anônima somente uma vez com
useEffecte uma array de dependência vazia.Na função anônima, criamos quatro objetos
Catdiferentes usando o operadornewpara criar um novo objeto de Realm em uma transação de gravação. Cada um dosCatobjetos utiliza um tipo de dados diferente para a propriedadebirthDate.Use o hook
useQuery()para recuperar todos os objetosCat.Map Mapeie os gatos para renderizar uma lista de componentes do
TextexibindonameebirthDatede cada fetivo.
1 const CreateCatsInput = () => { 2 const realm = useRealm(); 3 4 useEffect(() => { 5 // Add data to the Realm when the component mounts 6 realm.write(() => { 7 // create a Cat with a birthDate value of type string 8 realm.create('Cat', { 9 name: 'Euler', 10 birthDate: 'December 25th, 2017', 11 }); 12 13 // create a Cat with a birthDate value of type date 14 realm.create('Cat', { 15 name: 'Blaise', 16 birthDate: new Date('August 17, 2020'), 17 }); 18 19 // create a Cat with a birthDate value of type int 20 realm.create('Cat', {name: 'Euclid', birthDate: 10152021}); 21 22 // create a Cat with a birthDate value of type null 23 realm.create('Cat', {name: 'Pythagoras', birthDate: null}); 24 }); 25 }, []); 26 27 // retrieve all cats 28 const cats = useQuery(Cat); 29 30 return ( 31 <> 32 {cats.map(cat => ( 33 <View> 34 <Text>{cat.name}</Text> 35 <Text>{String(cat.birthDate)}</Text> 36 </View> 37 ))} 38 </> 39 ); 40 };
1 const CreateCatsInput = () => { 2 const realm = useRealm(); 3 4 useEffect(() => { 5 // Add data to the Realm when the component mounts 6 realm.write(() => { 7 // create a Cat with a birthDate value of type string 8 realm.create('Cat', { 9 name: 'Euler', 10 birthDate: 'December 25th, 2017', 11 }); 12 13 // create a Cat with a birthDate value of type date 14 realm.create('Cat', { 15 name: 'Blaise', 16 birthDate: new Date('August 17, 2020'), 17 }); 18 19 // create a Cat with a birthDate value of type int 20 realm.create('Cat', {name: 'Euclid', birthDate: 10152021}); 21 22 // create a Cat with a birthDate value of type null 23 realm.create('Cat', {name: 'Pythagoras', birthDate: null}); 24 }); 25 }, []); 26 27 // retrieve all cats 28 const cats = useQuery(Cat); 29 30 return ( 31 <> 32 {cats.map(cat => ( 33 <View> 34 <Text>{cat.name}</Text> 35 <Text>{String(cat.birthDate)}</Text> 36 </View> 37 ))} 38 </> 39 ); 40 };
query para objeto com valor misto
Para consultar objetos com um valor Misto, execute o método Collection.filtered() e passar um filtro para um campo não misto. Em seguida, você pode imprimir o valor da propriedade Mixed ou de todo o objeto .
Exemplo
No exemplo CatInfoCard a seguir, fazemos uma query para um objeto Cat usando o nome do cão.
O componente CatInfoCard faz o seguinte:
Obtenha todos os objetos
Catpassando a classeCatpara o ganchouseQuery()e, em seguida, usefiltered()para filtrar os resultados para receber somente os gatos cujos nomes correspondem ao nome passado como um suporte. Em seguida, obtemos o primeiro cão correspondente e o armazenamos como uma variável constante.Use a notação de ponto para recuperar a propriedade Misto,
birthDate.Exiba o nome e a data de nascimento do cão no método de renderização se o Realm encontrar o cão. Se não houver nenhum cão que corresponda ao nome passado ao componente como suporte, renderizamos o texto "Gato não encontrado".
1 const CatInfoCard = ({catName}) => { 2 // To query for the cat's birthDate, filter for their name to retrieve the realm object. 3 // Use dot notation to access the birthDate property. 4 const cat = useQuery( 5 Cat, 6 cats => { 7 return cats.filtered(`name = '${catName}'`); 8 }, 9 [catName], 10 )[0]; 11 const catBirthDate = cat.birthDate; 12 13 if (cat) { 14 return ( 15 <> 16 <Text>{catName}</Text> 17 <Text>{String(catBirthDate)}</Text> 18 </> 19 ); 20 } else { 21 return <Text>Cat not found</Text>; 22 } 23 };
1 type CatInfoCardProps = {catName: string}; 2 3 const CatInfoCard = ({catName}: CatInfoCardProps) => { 4 // To query for the cat's birthDate, filter for their name to retrieve the realm object. 5 // Use dot notation to access the birthDate property. 6 const cat = useQuery( 7 Cat, 8 cats => { 9 return cats.filtered(`name = '${catName}'`); 10 }, 11 [catName], 12 )[0]; 13 const catBirthDate = cat.birthDate; 14 15 if (cat) { 16 return ( 17 <> 18 <Text>{catName}</Text> 19 <Text>{String(catBirthDate)}</Text> 20 </> 21 ); 22 } else { 23 return <Text>Cat not found</Text>; 24 } 25 };
propriedade mistas e verificação de tipo
Como as propriedades mistas podem ser mais de um tipo, você não pode confiar em que o valor da propriedade seja de um tipo específico.
Com Object.getPropertyType(), você pode obter o tipo subjacente de uma propriedade Misto. Isso permite que você crie sua própria verificação de tipo.
// Use Type Predicates and Object.getPropertyType() to // create a runtime type check for Mixed properties. const isString = ( val: Mixed, name: string, object: Realm.Object, ): val is Realm.Types.String => { return object.getPropertyType(name) === 'string'; }; type CatInfoCardProps = {catName: string}; const CatInfoCard = ({catName}: CatInfoCardProps) => { const cat = useQuery( Cat, cats => { return cats.filtered(`name = '${catName}'`); }, [catName], )[0]; // Use the type check to handle your data. const catBirthDate = isString(cat.birthDate, 'birthDate', cat) ? cat.birthDate : cat.birthDate.toString(); if (cat) { return ( <> <Text>{catName}</Text> <Text>{catBirthDate}</Text> </> ); } else { return <Text>Cat not found</Text>; } };