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

Solução de problemas - .NET SDK

Nesta página

  • Resolver uma exceção "Sem propriedades na classe"
  • Fody: 'Ocorreu uma exceção não tratada'
  • Exceções do Fory Weber
  • Solução de problemas do WriteAsync
  • Resolver uma exceção "AddDefaultTypes deve ser chamado antes de criar uma Instância de Realm"
  • Explicação da causa
  • de conflitos
  • Alocação incorreta do sistema operacional iOS/iPad/memória insuficiente disponível

Você pode ver um System.InvalidOperationException com a mensagem "Nenhuma propriedade na classe, o vinculador removeu isso?".

Existem três causas conhecidas dessa exceção:

  • Você não tem RealmObjects embutidos, provavelmente porque algo deu errado com Fody. Se for esse o caso, RealmSchema lança uma exceção. Consulte Exceções do Fody Web para obter detalhes sobre como corrigir isso.

  • Um vinculador removeu propriedades de um ou mais RealmObjects, e o Realm acha que essas propriedades não existem. Isso pode ocorrer se você tiver seu Comportamento de vinculador definido como ,Link all assemblies mas não usou o [Preserve(AllMembers = true)] atributo na declaração de classe . O vinculador preserva apenas os membros da classe que você referenciou explicitamente no código ou marcou com o [Preserve(AllMembers = true)] atributo . Isso significa que, se você quiser persistir uma propriedade no Realm e ela não for referenciada em nenhum lugar do seu código, o vinculador poderá removê-la, causando uma incompatibilidade de esquema.

  • Você está usando uma ferramenta de ofuscação de código que está interrompendo a detecção do nome do modelo. O Realm depende dos nomes de classes para gerar o esquema, portanto, se uma ferramenta de ofuscação de código tiver ocultado esses nomes de classes, a geração de esquema falhará. Para resolver isso, defina sua ferramenta de ofuscação de código para ignorar suas classes de modelo.

Essa falha de construção comum é acionada quando você já criou um projeto e adiciona uma nova subclasse RealmObject . Escolher Build ou Run seu projeto não reconstrói o projeto de forma completa o suficiente para invocar o Fody Weaver. Para corrigir isso, escolha Rebuild seu projeto.

Você pode ver um aviso no registro de construção sobre as classes não terem sido tecidas. Isso indica que o pacote de tecelagem Fody não está instalado corretamente. Veja alguns itens a serem verificados:

  • Primeiro, verifique se o arquivo FodyWeavers.xml contém uma entrada para Realm.

  • Também é possível que a instalação do Fody tenha falhado. Os usuários têm experimentado isso com o Visual Studio 2015 e versões do NuGet pacote Manager anteriores à versão 3.2. Para diagnosticar isso, use um editor de texto para verificar se seu .csproj tem uma linha importando Fody.targets, como:

    <Import Project="..\packages\Fody.1.29.3\build\portable-net+sl+win+wpa+wp\Fody.targets"
    Condition="Exists('..\packages\Fody.1.29.3\build\portable-net+sl+win+wpa+wp\Fody.targets')" />

A correção mais fácil é atualizar para uma versão posterior do NuGet pacote Manager. Se isso não funcionar, pode haver um problema com Fody e Microsoft.Bcl.Build.targets. Removendo a seguinte linha do seu .csproj pode ajudar:

<Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets"
Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />

Dentro do método WriteAsync() , verificamos um objeto não nulo SynchronizationContext.Current para determinar se o código é executado no thread da interface do usuário. Esta verificação pode ser imprecisa se você tiver definido Current em seus threads de trabalho. Se você tiver definido SynchronizationContext.Current em um thread de trabalho, chame o método Write() em vez de WriteAsync().

Para obter mais informações, consulte Gravações assíncronas.

Você pode ver um System.NotSupportedException com a mensagem "AddDefaultTypes deve ser chamado antes de criar uma Instância de Realm". Isso pode acontecer quando você tem vários projeto contendo modelos do Realm e abre uma Instância de Realm antes que todos eles tenham sido carregados na memória.

O .NET usa carregamento lento para melhorar o desempenho. Uma montagem não é carregada até que um ou mais dos tipos que ela contém sejam necessários. No entanto, o Realm depende do inicializador de módulo para registrar todos os tipos em seu esquema padrão. Quando você abre um domínio pela primeira vez, o esquema padrão é bloqueado e qualquer tentativa de registrar mais tipos resultará na exceção acima.

Existem 3 formas de resolver este problema:

  1. Você pode colocar seus modelos de Realm na mesma montagem onde você chama Realm.GetInstance.

  2. Você pode pré-carregar a montagem que contém os Objeto de Realm criando um método estático na montagem e, em seguida, chamar esse método a partir do código do aplicativo:

    // In your models assembly
    public static class MyAssemblyLoader
    {
    public static void LoadMe() {}
    }
    // In your app
    public void Initialize()
    {
    MyAssemblyLoader.LoadMe();
    }
  3. Você pode especificar explicitamente o esquema de Realm ao inicializar o domínio:

    var config = new RealmConfiguration
    {
    Schema = new[] { typeof(Person), typeof(Company), ... }
    }

Em dispositivos iOS ou iPad com pouca memória disponível, ou quando você tiver um aplicativo com uso intensivo de memória que utilize vários realms ou muitas notificações, poderá encontrar o seguinte erro:

libc++abi: terminating due to an uncaught exception of type std::bad_alloc: std::bad_alloc

Esse erro normalmente indica que um recurso não pode ser alocado porque não há memória suficiente disponível.

Se estiver desenvolvendo para iOS 15+ ou iPad 15+, você pode adicionar o Extended Virtual Addressing Entitlement para resolver este problema.

Adicione estas chaves à sua Lista de propriedades e defina os valores para true:

<key>com.apple.developer.kernel.extended-virtual-addressing</key>
<true/>
<key>com.apple.developer.kernel.increased-memory-limit</key>
<true/>

Voltar

Compatibilidade