Resolver una excepción 'No hay propiedades en la clase'
Es posible que veas un System.InvalidOperationException con el mensaje "No hay propiedades en la clase, ¿el enlazador las ha eliminado?".
Hay tres causas conocidas de esta excepción:
No tienes objetos RealmObject entretejidos, probablemente porque algo falló con Fody. En ese caso,
RealmSchemagenera una excepción. Consulta Excepciones de Fody Weave para obtener detalles sobre cómo solucionar este problema.Un enlazador ha eliminado propiedades de uno o más RealmObjects, y Realm considera que esas propiedades no existen. Esto puede ocurrir si su comportamiento del enlazador...Se
Link all assembliesha establecido en, pero no se ha usado el[Preserve(AllMembers = true)]atributo en la declaración de clase. El enlazador solo conserva los miembros de clase a los que se ha hecho referencia explícitamente en el código o marcados con el[Preserve(AllMembers = true)]atributo. Esto significa que, si se desea conservar una propiedad en realm y no se hace referencia a ella en ningún punto del código, el enlazador podría eliminarla, lo que provocaría una discrepancia en el esquema.Estás usando una herramienta de ofuscación de código que interfiere con la detección de nombres de modelo. Realm se basa en los nombres de clase para generar el esquema, por lo que si una herramienta de ofuscación de código ha ocultado esos nombres de clase, la generación del esquema falla. Para solucionar esto, configura tu herramienta de ofuscación de código para que ignore las clases de tu modelo.
Fody: 'Se produjo una excepción no controlada'
Este error de compilación común se activa cuando ya ha compilado un proyecto y luego agrega una nueva subclase RealmObject. Al elegir
Build o Run su proyecto no se reconstruye con la suficiente precisión como para invocar Fody Weaver. Para solucionar esto, elija Rebuild su proyecto.
Excepciones de Fody Weave
Es posible que vea una advertencia en el registro de compilación sobre clases que no se han tejido. Esto indica que el paquete de tejido Fody no está instalado correctamente. Aquí tiene algunos puntos a revisar:
Primero, verifique que el archivo
FodyWeavers.xmlcontenga una entrada para Realm.También es posible que la instalación de Fody haya fallado. Algunos usuarios han experimentado esto con Visual Studio 2015 y versiones del Administrador de paquetes NuGet anteriores a la 3.2. Para diagnosticarlo, use un editor de texto para comprobar que su
.csprojtenga una línea que importeFody.targets, como por ejemplo:<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')" />
La solución más sencilla es actualizar a una versión posterior del Gestor de Paquetes NuGet. Si esto no funciona, es posible que haya un problema con Fody y Microsoft.Bcl.Build.targets. Eliminar la siguiente línea del archivo .csproj podría ser útil:
<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')" />
Solución de problemas de WriteAsync
Dentro del método WriteAsync(), buscamos un objeto SynchronizationContext.Current distinto de nulo para determinar si el código se ejecuta en el hilo de la interfaz de usuario. Esta comprobación puede ser inexacta si se ha definido Current en los hilos de trabajo. Si se ha definido SynchronizationContext.Current en un hilo de trabajo, se llama al método Write() en lugar de WriteAsync().
Para obtener más información, consulte Escrituras asincrónicas.
Resolución de una excepción 'AddDefaultTypes debe llamarse antes de crear una instancia de Realm'
Es posible que vea un System.NotSupportedException con el mensaje "AddDefaultTypes debe llamarse antes de crear una instancia de Realm". Esto puede ocurrir si tiene varios proyectos que contienen modelos de Realm y abre una instancia de Realm antes de que todos se hayan cargado en memoria.
Explicación de la causa
.NET utiliza la carga diferida para mejorar el rendimiento. Un ensamblado no se carga hasta que se necesita uno o más de los tipos que contiene. Sin embargo, Realm depende del inicializador del módulo para registrar todos los tipos en su esquema predeterminado. Al abrir un realm por primera vez, el esquema predeterminado se bloquea y cualquier intento de registrar más tipos generará la excepción mencionada.
Resolución
Hay 3 formas de resolver este problema:
Puedes colocar tus modelos de reino en el mismo ensamblaje donde llamas a
Realm.GetInstance.Puede precargar el ensamblaje que contiene los objetos de su reino creando un método estático en el ensamblaje y luego llamar a ese método desde el código de su aplicación:
// In your models assembly public static class MyAssemblyLoader { public static void LoadMe() {} } // In your app public void Initialize() { MyAssemblyLoader.LoadMe(); } Puede especificar explícitamente el esquema del reino al inicializar el reino:
var config = new RealmConfiguration { Schema = new[] { typeof(Person), typeof(Company), ... } }
iOS/iPad OS Mala asignación/No hay suficiente memoria disponible
En dispositivos iOS o iPad con poca memoria disponible, o donde tienes una aplicación que consume mucha memoria y utiliza varios reinos o muchas notificaciones, es posible que encuentres el siguiente error:
libc++abi: terminating due to an uncaught exception of type std::bad_alloc: std::bad_alloc
Este error generalmente indica que no se puede asignar un recurso porque no hay suficiente memoria disponible.
Si está compilando para iOS 15+ o iPad 15+, puede agregar el derecho de direccionamiento virtual extendido para resolver este problema.
Agregue estas claves a su lista de propiedades y establezca los valores en true:
<key>com.apple.developer.kernel.extended-virtual-addressing</key> <true/> <key>com.apple.developer.kernel.increased-memory-limit</key> <true/>