Gravar em um Realm sincronizado - .NET SDK
Nesta página
Visão geral
Ao gravar dados em um domínio sincronizado usando o Flexible Sync, você usa as mesmas APIs que usa ao gravar em um domínio local. No entanto, há algumas diferenças de comportamento que devem ser levadas em conta.
Quando você escreve em um Realm sincronizado, suas operações de escrita devem corresponder aos dois itens a seguir:
A query de assinatura de sincronização
As permissões em seu App Services App
Se você tentar gravar dados que não correspondem à query de assinatura e à expressão de permissões, a gravação será revertida e lançará uma CompensatingWriteException. Você pode examinar os registros do App Services para ver detalhes sobre o motivo pelo qual a gravação foi negada.
Compensação de escritas
Quando um cliente tenta uma gravação "ilegal" de um objeto, ocorre o seguinte:
Como o Realm do cliente não tem nenhum conceito de gravações "ilegais", a gravação inicialmente é bem-sucedida até que o Realm resolva o conjunto de alterações com o backend do App Services.
Após a sincronização, o servidor aplica as regras e permissões. O servidor determina que o usuário não tem autorização para realizar a gravação.
O servidor envia uma operação de reversão, chamada de "escrita compensatória", de volta ao cliente.
O realm do cliente reverte a operação de escrita ilegal e lança um
CompensatingWriteException
.
Qualquer escrita do lado do cliente em um objeto entre a escrita ilegal e a escrita compensatória correspondente será perdida.
Na prática, isso pode parecer um objeto sendo gravado no Realm e desaparecer depois que o servidor enviar a gravação compensatória de volta ao cliente.
Quando um CompensatingWriteException
é lançado, ele inclui um enumerável de objetos CompensatingWriteInfo . Cada objeto CompensatingWriteInfo
contém propriedades que descrevem o tipo de objeto, sua chave primária e a razão pela qual o servidor executou a gravação compensatória.
Determinando quais dados são sincronizados
A regra que controla quais dados você pode gravar em um Realm sincronizado é a interseção da configuração do Realm Mobile Sync, das permissões do App Services e da query de assinatura do Flexible Sync que você usa quando abre o Realm.
Vejamos um exemplo de como esses componentes trabalham juntos:
Configuração do Device Sync
O Realm Mobile Sync é configurado com os seguintes campo de query:
_id
(Sempre incluído)ownerId
Permissões do App Services
O App Services App tem permissões configuradas para permitir que os usuários leiam e escrevam somente seus próprios dados:
{ "name": "owner-read-write", "apply_when": {}, "document_filters": { "read": { "ownerId": "%%user.id" }, "write": { "ownerId": "%%user.id" } }, "read": true, "write": true }
Assinatura de Flexible Sync
A assinatura de Flexible Sync no cliente declara que o objeto deve ter um valor Status
de "concluído":
realm.Subscriptions.Update(() => { var completedItemsQuery = realm .All<MyTask>() .Where(i => i.Status == "completed"); realm.Subscriptions .Add(completedItemsQuery, new SubscriptionOptions() { Name = "completedItems" }); });
O resultado: quais dados são sincronizados?
A combinação da query de assinatura e das permissões significa que o Realm sincronizado sincroniza apenas objeto em que:
O
ownerId
corresponde aouser.id
do usuário conectado (a partir das permissões)O valor da propriedade
Status
é "concluído" (da query de assinatura)
Qualquer objeto na coleção Atlas em que o ownerId
não corresponda ao user.id
do usuário conectado ou o valor da propriedade Status
não "concluído" não possa ser sincronizado com esse domínio. Uma tentativa de gravar tal objeto lança um CompensatingWriteException
.
Para mais informações
Para saber mais sobre erros de permissão negada, erros de gravação compensatórios e outros tipos de erro do Device Sync , consulte Erros de sincronização na documentação do Atlas App Services .
Para saber mais sobre como configurar permissões para seu aplicativo, consulte Permissões baseadas em funções e o Guia de permissões deDevice Sync na documentação do Atlas App Services .