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

Gerenciar assinaturas de sincronização - React Native SDK

Nesta página

  • Pré-requisitos
  • Alinhe assinaturas com aplicativo de backend
  • Inscrever-se para receber queries
  • Inscrever-se em uma query
  • Aguarde uma assinatura de query para sincronizar
  • Cancelar assinatura de uma query
  • Gerenciar assinaturas manualmente
  • Acessar todas as assinaturas
  • Adicionar uma assinatura
  • Configurar um domínio com assinaturas iniciais
  • Verifique o status das assinaturas
  • Estado da assinatura "Concluído"
  • Atualizar assinaturas com uma nova query
  • Remover subscrições
  • Remover uma assinatura por query
  • Remover uma assinatura por nome
  • Remover uma assinatura por referência
  • Remover todas as assinaturas em um tipo de objeto
  • Remover todas as assinaturas sem nome
  • Remover todas as assinaturas
  • Considerações de desempenho
  • Eficiência da API
  • Atualizações de grupo para melhorar o desempenho
  • Requisitos e limitações do Flexible Sync RQL
  • Requisitos de inscrição de campos de query indexados
  • Operadores de consulta não suportados na sincronização flexível
  • Listar queries
  • Objetos incorporados ou vinculados
  • Limite de tamanho da query

O Flexible Sync usa assinaturas e permissões para determinar quais dados sincronizar com seu aplicativo. Você deve ter pelo menos uma assinatura antes de ler ou escrever em um domínio com o Flexible Sync habilitado. A biblioteca do @realm/react simplifica permissões e queries para sincronizar assinaturas.

Você pode adicionar, atualizar e remover assinaturas de query para controlar quais dados são sincronizados com o dispositivo cliente. No Realm.js v12.0.0 e posterior, você pode assinar queries em vez de gerenciar manualmente as assinaturas ou além delas.

Você não pode criar assinaturas para ingestão de dados e objetos assimétricos porque eles só enviam dados para o backend do App Services.

Importante

Limitações de query do Flexible Sync

As assinaturas do Flexible Sync oferecem suporte apenas a um subconjunto dos operadores de query RQL. Consulte a documentação Flexible Sync RQL das Limitações de do para obter informações sobre quais operadores não são suportados.

Você precisa atender aos seguintes requisitos antes de poder usar o Atlas Device Sync com o SDK do React Native:

  • Um Atlas cluster não compartilhado executando MongoDB 5.0 ou posterior.

  • Realm.js v10.12.0 ou mais tarde.

Antes de adicionar assinaturas Flexible Sync a um cliente React Native, você deve:

  1. Configurar o Flexible Sync no backend

  2. Inicialize o cliente do aplicativo

  3. Autenticar um usuário no cliente

  4. Configurar um Realm sincronizado

Suas queries de assinatura do lado do cliente devem estar alinhadas com a configuração do Device Sync em seu aplicativo de serviços de aplicativo de backend.

As queries de assinatura retornam todos os objetos de um tipo. Você pode filtrar os resultados com uma query do Realm Query Language que inclua um ou mais campos de query.

Para saber mais sobre como configurar campos consultáveis, consulte Campos de query na documentação do Atlas App Services .

Para saber mais sobre as limitações do uso da Realm Query Language com o Flexible Sync, consulte a seção Limitações da RQL do Flexible Sync.

Novidades na versão realm@12.0.0.

realm@12.0.0 adiciona APIs experimentais que se inscrevem e cancelam a assinatura dos resultados de uma query. Essas APIs resumem os detalhes de adicionar e remover assinaturas manualmente.

Para todas as assinaturas, você precisa de um usuário autenticado e um termo do Flexible Sync.

Alterado na versão realm@12.3.0: Dados geoespaciais suportados no Atlas Device Sync

No Realm.js v12.3.0 e posterior, você pode criar assinaturas para queries geoespaciais. Se você tentar se inscrever em uma query geoespacial com uma versão mais antiga do SDK, receberá um erro de servidor com uma gravação compensatória.

Para mais informações, consulte Geospatial - React Native SDK.

Recomendamos que você nomeie suas assinaturas. Isso torna mais fácil encontrar e gerenciar suas assinaturas. Os nomes das assinaturas devem ser exclusivos. Tentar adicionar uma assinatura com o mesmo nome de uma assinatura existente substitui a assinatura existente.

Para assinar uma query:

  1. Consulte os objetos que você deseja ler e gravar.

  2. Ligue para subscribe() nos resultados da query para criar uma assinatura de sincronização para objetos correspondentes à query.

  3. Passe um objeto SubscriptionOptions que contenha a propriedade name para subscribe().

import React, {useEffect, useState} from 'react';
import {useRealm, useQuery} from '@realm/react';
import {View, Text, FlatList} from 'react-native';
import {Bird} from '../../models';
import {Subscription} from 'realm/dist/bundle';
export const BasicSubscription = () => {
const realm = useRealm();
// Get all local birds that have not been seen yet.
const seenBirds = useQuery(Bird, collection =>
collection.filtered('haveSeen == true'),
);
const [seenBirdsSubscription, setSeenBirdsSubscription] =
useState<Subscription | null>();
useEffect(() => {
// Create an async function so that we can `await` the
// promise from `.subscribe()`.
const createSubscription = async () => {
await seenBirds.subscribe({
name: 'Birds I have seen',
});
};
createSubscription().catch(console.error);
// Get the subscription...
const subscription = realm.subscriptions.findByName('Birds I have seen');
// ... and set it to a stateful variable or manage it in `useEffect`.
setSeenBirdsSubscription(subscription);
}, []);
return (
// Work with the subscribed results list or modify the subscription...
<></>
);
};

Na maioria das vezes, você deve dar um nome às suas assinaturas. Caso contrário, o nome está definido como null.

Se você usar filtered() em uma assinatura de query sem nome, o identificador de assinatura será baseado na query filtered. Isto significa que toda vez que sua string de query for alterada, o subscribe() criará uma nova assinatura.

Referência da API

Quando você assina os resultados de uma query, os resultados não contêm objetos até que os dados sincronizados sejam baixados. Quando for necessário aguardar o término do download dos objetos sincronizados, configure a opção waitForSync.

Este exemplo utiliza a opção FirstTime , que é o comportamento padrão. Uma assinatura com comportamento FirstTime somente aguarda a sincronização terminar quando uma assinatura é criada pela primeira vez.

import React, {useEffect, useState} from 'react';
import {BSON, WaitForSync} from 'realm';
import {useRealm, useQuery} from '@realm/react';
import {View, Text, Button, TextInput, FlatList} from 'react-native';
import {Bird} from '../../models';
import {Subscription} from 'realm/dist/bundle';
export const WaitFirstTime = () => {
const realm = useRealm();
const [birdName, setBirdName] = useState('Change me!');
// Get local birds that have been marked as "haveSeen".
const seenBirds = useQuery(Bird, collection =>
collection.filtered('haveSeen == true'),
);
const [seenBirdsSubscription, setSeenBirdsSubscription] =
useState<Subscription | null>();
useEffect(() => {
const createSubscription = async () => {
// Only wait for sync to finish on the initial sync.
await seenBirds.subscribe({
behavior: WaitForSync.FirstTime,
name: 'First time sync only',
});
};
createSubscription().catch(console.error);
// Get the subscription...
const subscription = realm.subscriptions.findByName('First time sync only');
// ... and set it to a stateful variable or manage it in `useEffect`.
setSeenBirdsSubscription(subscription);
}, []);
return (
// Work with the subscribed results list or modify the subscription...
<></>
);
};

As outras opções WaitForSync suportadas são:

  • Always: Aguarde o download dos objetos correspondentes toda vez que seu aplicativo for iniciado. O aplicativo deve ter uma conexão com a Internet em cada lançamento.

  • Never: Nunca espere para baixar objetos correspondentes. O aplicativo precisa de uma conexão com a Internet para que o usuário se autentique na primeira vez que o aplicativo for iniciado, mas pode ser aberto off-line nas inicializações subsequentes usando credenciais em cache.

Opcionalmente, você pode especificar um valor timeout para limitar quanto tempo o download de sincronização é executado:

export const AlwaysWait = () => {
const realm = useRealm();
// Get all local birds that have not been seen yet.
const unSeenBirds = useQuery(Bird, collection =>
collection.filtered('haveSeen == false'),
);
const [unSeenBirdsSubscription, setUnseenBirdsSubscription] =
useState<Subscription | null>();
useEffect(() => {
const createSubscription = async () => {
// Add subscription with timeout.
// If timeout expires before sync is completed, currently-downloaded
// objects are returned and sync download continues in the background.
await unSeenBirds.subscribe({
behavior: WaitForSync.Always,
name: 'Always wait',
timeout: 500,
});
};
createSubscription().catch(console.error);
// Get the subscription...
const subscription = realm.subscriptions.findByName('Always wait');
// ... and set it to a stateful variable or manage it in `useEffect`.
setUnseenBirdsSubscription(subscription);
}, []);
return (
// Work with the subscribed results list or modify the subscription...
<></>
);
};

Referência da API

As assinaturas persistem entre as sessões de usuário, a menos que você cancele a assinatura delas. Você pode cancelar a assinatura dos resultados de uma query usando unsubscribe().

Isso remove a assinatura da lista de assinaturas ativas, semelhante à remoção manual de uma assinatura.

Uma lista de resultados ainda pode conter objetos após ligar para unsubscribe() se houver outra assinatura que contenha objetos sobrepostos.

Quando você chama unsubscribe(), a assinatura associada é removida. As assinaturas são removidas por nome. Se eles não tiverem um nome, unsubscribe() remove todas as queries que correspondam exatamente à que você chama unsubscribe().

O método unsubscribe() retorna antes que os objetos correspondentes à assinatura removida sejam excluídos do domínio. A sincronização continua em segundo plano com base no novo conjunto de assinaturas.

import React, {useEffect, useState} from 'react';
import {useRealm, useQuery} from '@realm/react';
import {View, Text, Button} from 'react-native';
import {Bird} from '../../models';
import {Subscription} from 'realm/dist/bundle';
export const Unsubscribe = () => {
const realm = useRealm();
const birds = useQuery(Bird);
const unsubscribeFromQuery = () => {
birds.unsubscribe();
};
return (
<View>
<Button
title="Unsubscribe"
onPress={() => {
unsubscribeFromQuery();
}}
/>
</View>
);
};

Referência da API

Você pode usar a API de Assinaturas para gerenciar manualmente um conjunto de assinaturas para queries específicas em campos consultáveis.

Você pode usar o realm.Subscriptions API para gerenciar um conjunto de assinaturas para queries específicas em campos consultáveis.

Se você estiver usando @realm/react, poderá gerenciar assinaturas de realm dentro de um RealmProvider configurado corretamente. O gancho useRealm() dá acesso ao realm aberto atualmente.

Você pode fazer o seguinte com suas assinaturas:

Quando os dados correspondem à assinatura e o usuário autenticado tem as permissões apropriadas, o Device Sync sincroniza os dados de backend com o aplicativo cliente.

Quando você cria uma assinatura, o Realm procura dados correspondentes a uma query em um tipo de objeto específico. Você pode ter assinaturas em vários tipos de objetos diferentes. Você também pode ter várias queries no mesmo tipo de objeto.

Importante

Links de objetos

Você deve adicionar um objeto e seu objeto vinculado ao conjunto de assinaturas para ver um objeto vinculado.

Se os resultados de sua assinatura contiverem um objeto com uma propriedade vinculada a um objeto não contido nos resultados, o link parecerá nulo. Não há como distinguir se o valor dessa propriedade é legitimamente nulo ou se o objeto ao qual ela se vincula existe, mas está fora da exibição da assinatura de query..

Dentro de um RealmProvider configurado para Flexible Sync, você pode acessar um SubscriptionSet. Um conjunto de subscrições é uma coleção de todas as subscrições da sua aplicação.

import React, {useEffect, useState} from 'react';
import {Text, FlatList} from 'react-native';
import {useRealm, useQuery} from '@realm/react';
import {Bird} from '../Models/Bird';
function SubscriptionManager() {
const realm = useRealm();
// Pass object model to useQuery and filter results.
// This does not create a subscription.
const seenBirds = useQuery(Bird, birds => {
return birds.filtered('haveSeen == true');
});
const [subscriptions, setSubcriptions] = useState<
App.Sync.SubscriptionSet | undefined
>();
useEffect(() => {
const createSubscription = async () => {
// Create subscription for filtered results.
await realm.subscriptions.update(mutableSubs => {
mutableSubs.add(seenBirds, {name: 'seen birds'});
});
};
createSubscription().catch(console.error);
// Set to state variable.
setSubcriptions(realm.subscriptions);
}, []);
return (
<FlatList
data={subscriptions}
keyExtractor={subscription => subscription.id.toString()}
renderItem={({item}) => <Text>{item.name}</Text>}
/>
);
}

Referência da API

No exemplo seguinte, completed e progressMinutes foram definidos como campos consultáveis em um aplicativo do App Services. No código do cliente, criamos queries filtradas e, em seguida, assinamos seus resultados:

  • Tarefas concluídas

  • Tarefas concluídas que assumiram mais de 120 progressMinutes

Observe que useQuery() precisa de uma assinatura ativa para retornar os resultados. Se nenhuma assinatura tiver sido adicionada ainda, useQuery() retornará um resultado vazio, que não é um query válido para MutableSubscriptionSet.add().

import React, {useEffect} from 'react';
import {Text, FlatList} from 'react-native';
import {useRealm, useQuery} from '@realm/react';
function SubscriptionManager() {
const realm = useRealm();
const seenBirds = useQuery(Bird, birds => {
return birds.filtered('haveSeen == true');
});
useEffect(() => {
realm.subscriptions.update(
(mutableSubs: Realm.App.Sync.MutableSubscriptionSet) => {
// Create subscription for filtered collection.
mutableSubs.add(seenBirds, {name: 'seenBirds'});
},
);
});
return (
<FlatList
data={seenBirds}
keyExtractor={item => item._id.toString()}
renderItem={({item}) => <Text>{item._id.toString()}</Text>}
/>
);
}

Você deve ter pelo menos uma assinatura antes de ler ou escrever em um domínio Flexible Sync. As assinaturas iniciais permitem definir assinaturas ao configurar um território sincronizado.

Para abrir um domínio sincronizado com assinaturas iniciais, adicione uma propriedade initialSubscriptions a uma configuração de sincronização do RealmProvider.

Você não pode utilizar os ganchos da biblioteca @realm/react useQuery e useObject ao configurar assinaturas iniciais. Em vez disso, utilize as operações de leitura e escrita do Realm.js.

import React from 'react';
import {AppProvider, UserProvider} from '@realm/react';
// get realm context from createRealmContext()
import {RealmContext} from '../RealmConfig';
import {Text, FlatList} from 'react-native';
const {RealmProvider, useQuery} = RealmContext;
function AppWrapper() {
return (
<AppProvider id={APP_ID}>
<UserProvider fallback={LogIn}>
<RealmProvider
sync={{
flexible: true,
initialSubscriptions: {
update(subs, realm) {
subs.add(realm.objects('Turtle'));
},
},
onError: console.log,
}}>
<SubscriptionManager />
</RealmProvider>
</UserProvider>
</AppProvider>
);
}
function SubscriptionManager() {
// Pass object model to useQuery to get all objects of type `Turtle`.
// These results automatically update with changes from other devices
// because we created a subscription with `initialSubscriptions`.
const allTurtles = useQuery('Turtle');
return (
<FlatList
data={allTurtles}
keyExtractor={turtle => turtle._id.toString()}
renderItem={({item}) => <Text>{item._id}</Text>}
/>
);
}

Por padrão, as assinaturas iniciais são criadas somente na primeira vez que um domínio é aberto. Se seu aplicativo precisar executar novamente essa assinatura inicial toda vez que o aplicativo for iniciado, você poderá definir rerunOnOpen como true. Talvez seja necessário fazer isso para executar novamente intervalos de tempo dinâmicos ou outras queries que exijam um novo cálculo de variáveis estáticas para a assinatura.

Referência da API

Você pode verificar o estado da assinatura para ver se o servidor reconheceu a assinatura e se o dispositivo baixou os dados localmente.

Você pode usar o estado da assinatura para:

  • Acione o tratamento de erros

  • Mostrar se a transação está pendente ou foi concluída

  • Descubra quando um conjunto de assinaturas é substituído e você deve obter uma nova instância do conjunto de assinaturas para gravar uma alteração de assinatura

import React, {useEffect} from 'react';
import {Text, View} from 'react-native';
import {useRealm, useQuery} from '@realm/react';
import {Bird} from '../Models/Bird';
function SubscriptionManager() {
const realm = useRealm();
const seenBirds = useQuery(Bird, birds => {
return birds.filtered('haveSeen == true');
});
useEffect(() => {
realm.subscriptions.update(
(mutableSubs: Realm.App.Sync.MutableSubscriptionSet) => {
// Create subscription for filtered collection.
mutableSubs.add(seenBirds, {name: 'seenBirds'});
},
);
});
// Returns state of all subscriptions, not individual subscriptions.
// In this case, it's just the subscription for `Bird` objects where
// `haveSeen` is true.
const allSubscriptionState = realm.subscriptions.state;
return (
<View>
<Text >
Status of all subscriptions: {allSubscriptionState}
</Text>
</View>
);
}

Novidades na versão realm@12.0.0.

Realm.js v12.0.0 adicionou o enum SubscriptionSetState que você pode usar para obter o status de uma assinatura.

O estado do conjunto de assinaturas "complete" não significa que a sincronização "está concluída" ou "todos os documentos foram sincronizados". "Completo" significa que as duas coisas a seguir aconteceram:

  • A assinatura se tornou o conjunto de assinaturas ativo que está sendo atualmente sincronizado com o servidor.

  • Os documentos que correspondiam à assinatura no momento em que a assinatura foi enviada ao servidor agora estão no dispositivo local. Observe que isso não inclui necessariamente todos os documentos que atualmente correspondem à assinatura.

O SDK do Realm não fornece uma maneira de verificar se todos os documentos que correspondem a uma assinatura foram sincronizados com o dispositivo.

Você pode atualizar uma assinatura nomeada com uma nova query. Para atualizar a query de uma assinatura, passe a nova query e uma opção de assinatura com o nome da assinatura que você deseja atualizar para o método MutableSubscriptionSet.add() . Como adicionar uma nova assinatura, você deve atualizar uma assinatura dentro de uma transação ligando para subscriptions.update().

O exemplo a seguir redefine tarefas de longa duração como quaisquer tarefas que levem mais de 180 minutos.

realm.subscriptions.update((mutableSubs) => {
mutableSubs.add(
tasks.filtered('status == "completed" && progressMinutes > 180'),
{
name: "longRunningTasksSubscription",
}
);
});

Observação

A tentativa de atualizar uma assinatura que tenha o campo SubscriptionOptions.throwOnUpdate definido como true gera uma exceção.

Referência da API

Os conjuntos de assinaturas persistem entre sessões, mesmo que você não inclua mais a assinatura em seu código. As informações de assinatura são armazenadas no arquivo de banco de dados da região sincronizada. Você deve remover explicitamente uma assinatura para que pare de tentar sincronizar os dados correspondentes.

Você pode remover assinaturas das seguintes maneiras:

  • Remover uma única assinatura com uma query específica

  • Remover uma única assinatura com um nome específico

  • Remover todas as assinaturas de um modelo de objeto específico

  • Remover todas as assinaturas sem nome

  • Remover todas as assinaturas

Quando você remove uma query de assinatura, o servidor também remove os dados sincronizados do dispositivo cliente.

Os exemplos desta seção pressupõem que você esteja trabalhando com @realm/react e um RealmProvider configurado corretamente.

import {useEffect} from 'react';
// get realm context from createRealmContext()
import {RealmContext} from '../RealmConfig';
const {useRealm} = RealmContext;
function SubscriptionManager() {
const realm = useRealm();
useEffect(() => {
realm.subscriptions.update(mutableSubs => {
// Remove subscription for object type `Turtle`,
// which we added in `initialSubscriptions`.
mutableSubs.removeByObjectType('Turtle');
});
});
return (
// ...
);
}

Você pode remover uma assinatura específica por query executando uma transação no conjunto de assinaturas. Passe a query para MutableSubscriptionSet.remove() dentro de uma transação de gravação.

realm.subscriptions.update((mutableSubs) => {
// remove a subscription with a specific query
mutableSubs.remove(tasks.filtered('owner == "Ben"'));
});

Para remover uma assinatura específica por nome, execute uma transação no conjunto de assinaturas. Na transação, passe o nome para MutableSubscriptionSet.removeByName().

realm.subscriptions.update((mutableSubs) => {
// remove a subscription with a specific name
mutableSubs.removeByName("longRunningTasksSubscription");
});

Se você tiver uma referência a uma assinatura, poderá removê-la. Para isso, execute uma transação no conjunto de assinaturas. Na transação, passe a variável de referência para MutableSubscriptionSet.removeSubscription().

let subscriptionReference;
realm.subscriptions.update((mutableSubs) => {
subscriptionReference = mutableSubs.add(realm.objects("Task"));
});
// later..
realm.subscriptions.removeSubscription(subscriptionReference);

Para remover todas as assinaturas de um tipo de objeto específico, execute uma transação no conjunto de assinaturas. Na transação, passe o tipo de objeto como uma string para MutableSubscriptionSet.removeByObjectType().

realm.subscriptions.update((mutableSubs) => {
mutableSubs.removeByObjectType("Team");
});

Novidades na versão realm@v12.0.0.

Você pode querer remover assinaturas não nomeadas que são transitórias ou geradas dinamicamente, mas deixar assinaturas nomeadas em vigor.

Você pode remover todas as assinaturas sem nome da assinatura definida ligando para .removeUnnamed() em mutableSubs. .removeUnnamed() retorna o número de assinaturas sem nome removidas.

// Remove unnamed subscriptions.
let numberRemovedSubscriptions = 0;
await realm.subscriptions.update((mutableSubs) => {
numberRemovedSubscriptions = mutableSubs.removeUnnamed();
});

Referência da API

Para remover todas as assinaturas do conjunto de assinaturas, execute uma transação no conjunto de assinaturas. Chame MutableSubscriptionSet.removeAll() em uma transação de gravação.

realm.subscriptions.update((mutableSubs) => {
mutableSubs.removeAll();
});

O gerenciamento de várias assinaturas com as APIs subscribe() e unsubscribe() descritas na seção Assinar queries é menos eficiente do que executar atualizações em lote quando você gerencia assinaturas manualmente.

Para obter melhor desempenho ao fazer várias alterações na assinatura, use a API subscriptions para atualizar todas as assinaturas em uma única transação. Para saber como, consulte Gerenciar assinaturas manualmente.

Cada transação de escrita para um conjunto de assinaturas tem um custo de desempenho. Se você precisar fazer várias atualizações em um objeto do Realm durante uma sessão, considere manter objetos editados na memória até que todas as alterações sejam concluídas. Isso melhora o desempenho da sincronização, gravando apenas o objeto completo e atualizado em seu domínio, em vez de cada alteração.

Adicionar um campo de query indexado à sua aplicação pode melhorar o desempenho de queries simples em dados fortemente particionados. Por exemplo, uma aplicação onde as queries mapeiam fortemente os dados para um dispositivo, armazém ou usuário, como user_id == $0, “641374b03725038381d2e1fb”, é uma boa candidata para um campo de query indexado. No entanto, um campo de query indexado tem requisitos específicos para uso em uma inscrição de query:

  • O campo de query indexado deve ser usado em todas as inscrições de query. Não pode estar faltando na query.

  • O campo de query indexado deve usar uma comparação == ou IN com uma constante pelo menos uma vez na query de inscrição. Por exemplo, user_id == $0, "641374b03725038381d2e1fb" ou store_id IN $0, {1,2,3}.

Opcionalmente, você pode incluir uma comparação AND, desde que o campo consultável indexado seja comparado diretamente com uma constante usando == ou IN pelo menos uma vez. Por exemplo, store_id IN {1,2,3} AND region=="Northeast" ou store_id == 1 AND (active_promotions < 5 OR num_employees < 10).

As consultas inválidas do Flexible Sync em um campo indexado que pode ser consultado incluem consultas em que:

  • O campo de consulta indexado não utiliza AND com o resto da consulta. Por exemplo store_id IN {1,2,3} OR region=="Northeast" é inválido porque usa OR em vez de AND. Da mesma forma, store_id == 1 AND active_promotions < 5 OR num_employees < 10 é inválido porque o AND só se aplica ao termo ao lado, não à consulta inteira.

  • O campo de consulta indexado não é utilizado em um operador de igualdade. Por exemplo store_id > 2 AND region=="Northeast" é inválido porque utiliza apenas o operador > com o campo de consulta indexado e não tem uma comparação de igualdade.

  • A query está totalmente ausente do campo de query indexado. Por exemplo, region=="Northeast ou truepredicate são inválidos porque não contêm o campo de query indexado.

A Flexible Sync tem algumas limitações ao usar operadores RQL. Quando você escreve a assinatura de consulta que determina quais dados sincronizar, o servidor não oferece suporte a esses operadores de consulta. No entanto, você ainda pode usar toda a gama de recursos de RQL para consultar o conjunto de dados sincronizado no aplicativo cliente.

Tipo de operador
Operadores não suportados
Operadores agregados
@avg, @count, @max, @min, @sum
Sufixos de query
DISTINCT, SORT , LIMIT

Queries que não diferenciam maiúsculas de minúsculas ([c]) não podem usar índices de forma eficaz. Sendo assim, queries que não diferenciam maiúsculas de minúsculas não são recomendadas, pois podem causar problemas de desempenho.

A sincronização flexível suporta apenas @count para campos de array.

A sincronização flexível oferece suporte às listas de query usando o operador IN .

Você pode consultar uma lista de constantes para ver se ela contém o valor de um campo de consulta:

// Query a constant list for a queryable field value
"priority IN { 1, 2, 3 }"

Se um campo de query tiver um valor de array, você poderá consultar para ver se ele contém um valor constante:

// Query an array-valued queryable field for a constant value
"'comedy' IN genres"

Aviso

Não é possível comparar duas listas entre si em uma consulta de sincronização flexível. Observe que esta é uma sintaxe válida do Realm Query Language fora das consultas do Flexible Sync.

// Invalid Flexible Sync query. Do not do this!
"{'comedy', 'horror', 'suspense'} IN genres"
// Another invalid Flexible Sync query. Do not do this!
"ANY {'comedy', 'horror', 'suspense'} != ANY genres"

A sincronização Flexível não oferece suporte à consulta de propriedades em objetos ou links embarcados. Por exemplo, obj1.field == "foo".

O limite de tamanho para qualquer assinatura de query em seu conjunto de assinaturas é de 256 kB. Exceder esse limite resulta em um erro de LimitsExceeded.

Voltar

Configurar um realm sincronizado

Próximo

Gerenciar sessão de sincronização