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
Resolver uma exceção "Sem propriedades na classe"
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.
Fody: 'Ocorreu uma exceção não tratada'
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.
Exceções do Fory Weber
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 importandoFody.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')" />
Solução de problemas do WriteAsync
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.
Resolver uma exceção "AddDefaultTypes deve ser chamado antes de criar uma Instância de Realm"
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.
Explicação da causa
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.
de conflitos
Existem 3 formas de resolver este problema:
Você pode colocar seus modelos de Realm na mesma montagem onde você chama
Realm.GetInstance
.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(); } Você pode especificar explicitamente o esquema de Realm ao inicializar o domínio:
var config = new RealmConfiguration { Schema = new[] { typeof(Person), typeof(Company), ... } }
Alocação incorreta do sistema operacional iOS/iPad/memória insuficiente disponível
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/>