Un dominio es un conjunto de objetos relacionados que se ajustan a un esquema predefinido. Los dominios pueden contener más de un tipo de datos, siempre que exista un esquema para cada tipo.
Cada reino almacena datos en un archivo de reino independiente que contiene la codificación binaria de cada objeto del reino. Puedes... sincronizar el reino en múltiples dispositivos y configurar controladores de eventos reactivos que llamen a una función cada vez que se crea, modifica o elimina un objeto en un reino.
El ciclo de vida del reino
Cada instancia de un reino consume una cantidad significativa de recursos. Abrir y cerrar un reino son operaciones costosas, pero mantenerlo abierto también supone una sobrecarga significativa de recursos. Para maximizar el rendimiento de su aplicación, debe minimizar el número de reinos abiertos en un momento dado y limitar el número de operaciones de apertura y cierre.
Sin embargo, abrir un reino no siempre es costoso. Si el reino ya está abierto dentro del mismo proceso o hilo, abrir una instancia adicional requiere menos recursos:
Si el realm no se abre en el mismo proceso, abrir el realm es costoso.
Si el reino ya está abierto en un hilo diferente dentro del mismo proceso, abrir el reino es menos costoso, pero sigue siendo no trivial.
Si el reino ya está abierto en el mismo hilo dentro del mismo proceso, abrir el reino requiere recursos adicionales mínimos.
Al abrir un dominio por primera vez, Realm realiza el mapeo de memoria y la validación del esquema necesarios para leer y escribir datos en él. Las instancias adicionales de ese dominio en el mismo subproceso utilizan los mismos recursos subyacentes. Las instancias de ese dominio en subprocesos separados utilizan algunos de los mismos recursos subyacentes.
Cuando se cierran todas las conexiones a un reino en un hilo, Realm libera los recursos del hilo utilizados para conectarse a ese reino. Cuando se cierran todas las conexiones a un reino en un proceso, Realm libera todos los recursos utilizados para conectarse a ese reino.
Como práctica recomendada, recomendamos vincular el ciclo de vida de la instancia de dominio con los ciclos de vida de las vistas que lo observan. Por ejemplo, considere RecyclerView que muestra datos RealmResults mediante un Fragment. Podrías:
Abra un único reino que contenga los datos para esa vista en el método de ciclo de vida
Fragment.onCreateView().Cierre ese mismo reino en el método de ciclo de vida
Fragment.onDestroyView().
Nota
Si su reino es especialmente grande, obtener una instancia de reino en Fragment.onCreateView() podría bloquear brevemente la renderización. Si abrir su reino en onCreateView() causa problemas de rendimiento, considere administrarlo desde Fragment.onStart() y Fragment.onStop().
Si varias instancias de Fragment requieren acceso al mismo conjunto de datos, puedes gestionar un único realm en el Activity que las contiene:
Abra el reino en el método de ciclo de vida
Activity.onCreate().Cierra el reino en el método de ciclo de vida
Activity.onDestroy().
Multiproceso
No se puede acceder simultáneamente a dominios cifrados o sincronizados desde diferentes procesos. Sin embargo, los dominios locales funcionan con normalidad entre procesos, por lo que se pueden leer, escribir y recibir notificaciones de varios APK.
Esquema de reino
Un esquema de dominio es una lista de esquemas de objetos válidos, cada uno de los cuales define un tipo de objeto que una aplicación puede conservar. Todos los objetos de un dominio deben cumplir con el esquema de dominio.
Por defecto, el SDK agrega automáticamente todas las clases de tu proyecto que deriven de RealmObject al esquema de realm.
Las aplicaciones cliente proporcionan un esquema de dominio al abrir un dominio. Si un dominio ya contiene datos, Realm valida cada objeto existente para garantizar que se haya proporcionado un esquema de objeto para su tipo y que cumpla con todas las restricciones especificadas en el esquema.
Ejemplo
Un reino que contiene datos básicos sobre libros en bibliotecas podría utilizar un esquema como el siguiente:
[ { "type": "Library", "properties": { "address": "string", "books": "Book[]" } }, { "type": "Book", "primaryKey": "isbn", "properties": { "isbn": "string", "title": "string", "author": "string", "numberOwned": { "type": "int?", "default": 0 }, "numberLoaned": { "type": "int?", "default": 0 } } } ]
Realms sincronizados
Una aplicación que utiliza Atlas Device Sync puede abrir un reino sincronizado.
Al usar Sincronización Flexible, puede personalizar los datos que sincroniza su aplicación cliente suscribiéndose a consultas. Estas consultas buscan datos en el backend de su aplicación, y el dominio de Sincronización Flexible sincroniza los datos que coinciden con ellas. La aplicación cliente solo puede sincronizar datos si el usuario tiene los permisos de lectura o de lectura y escritura adecuados para acceder a ellos.
Al usar la sincronización basada en particiones, los dominios sincronizados representan particiones de datos de Atlas. Cada dominio corresponde a un subconjunto de los datos en la fuente de datos de su aplicación. Puede personalizar la partición de los datos mediante la clave de partición de su aplicación. Los valores únicos de la clave de partición, conocidos como valores de partición, corresponden a dominios individuales.
Puedes personalizar los permisos para los datos que los reinos sincronizados pueden leer y escribir desde tu aplicación cuando configuras las reglas de reino.
Para obtener más información, consulte Configurar un dominio sincronizado - SDK de Java.
Encuentra tu archivo de reino
Realm almacena una versión codificada en binario de cada objeto y tipo en un reino en un único archivo .realm.
El sistema de archivos que utilizan los emuladores de Android no es accesible directamente desde el equipo que ejecuta Realm Studio. Debe descargar el archivo del emulador para poder acceder a él.
Primero, busque la ruta del archivo en el emulador:
// Run this on the device to find the path on the emulator Realm realm = Realm.getDefaultInstance(); Log.i("Realm", realm.getPath());
Luego, descarga el archivo usando ADB. Puedes hacerlo mientras la aplicación está ejecutándose.
> adb pull <path>
También puedes volver a cargar el archivo modificado con ADB, pero solo cuando la aplicación no esté ejecutándose. Subir un archivo modificado mientras la aplicación está ejecutándose puede dañarlo.
> adb push <file> <path>
Tip
Archivos de reino auxiliar
Realm crea archivos adicionales para cada reino. Para obtener más información sobre estos archivos, consulte "Funcionamiento interno de Realm".
Tamaño del archivo de Realm
Realm suele ocupar menos espacio en disco que una base de datos SQLite equivalente. Sin embargo, para ofrecer una vista consistente de los datos, Realm opera con varias versiones de un mismo reino. Si se abren varias versiones de un mismo reino simultáneamente, el archivo del reino puede requerir espacio adicional en disco.
Estas versiones ocupan una cantidad de espacio que depende de la cantidad de cambios en cada transacción. Muchas transacciones pequeñas tienen la misma sobrecarga que un número reducido de transacciones grandes.
El crecimiento inesperado del tamaño del archivo suele ocurrir por una de tres razones:
Se abre un reino en un hilo en segundo plano y se olvida cerrarlo. Como resultado, Realm conserva una referencia a la versión anterior de los datos en el hilo en segundo plano. Dado que Realm actualiza automáticamente los reinos a la versión más reciente en hilos con bucles, el hilo de interfaz de usuario y otros hilos de bucle no presentan este problema.
Contiene referencias a demasiadas versiones de objetos congelados. Los objetos congelados conservan la versión de un reino que existía cuando se congelaron inicialmente. Si necesita congelar una gran cantidad de objetos, considere usar Realm.copyFromRealm() para conservar solo los datos necesarios.
Lees datos de un dominio. Luego, bloqueas el hilo con una operación de larga duración. Mientras tanto, escribes varias veces en el dominio en otros hilos. Esto hace que Realm cree muchas versiones intermedias. Puedes evitarlo:
agrupando las escrituras
evitando dejar el reino abierto mientras se bloquea el hilo de fondo.
Limitar el número máximo de versiones activas
Puedes configurar maxNumberOfActiveVersions() al compilar tu para RealmConfiguration que genere un IllegalStateException si tu aplicación abre más versiones de un reino que el número permitido. Las versiones se crean al ejecutar una transacción de escritura.
Realm elimina automáticamente las versiones anteriores de los datos cuando la aplicación ya no los utiliza. Sin embargo, Realm no libera el espacio ocupado por las versiones anteriores, sino que lo utiliza para nuevas escrituras en el dominio.
Compactar un reino
Puedes eliminar el espacio no utilizado compactando el archivo realm:
Manualmente: llamar a compactRealm()
Automáticamente: especifique la opción de construcción compactOnLaunch() al abrir la primera conexión a un reino en su aplicación de Android
Importante
Compactar todas las aplicaciones de producción
Cada aplicación de producción debe implementar la compactación para reducir periódicamente el tamaño del archivo de reino.
Copia de seguridad y restauración de dominios
Realm guarda los reinos en el disco usando archivos en tu dispositivo Android. Parahacer una copia de seguridad de un reino, busca el archivo y cópialo a una ubicación segura. Debes cerrar todas las instancias del reino antes de copiarlo.
Alternativamente, también puedes usar realm.writeCopyTo() para escribir una versión compactada de un reino en un archivo de destino.
Modules
Los módulos de Realm describen el conjunto de objetos de Realm que se pueden almacenar en un dominio. De forma predeterminada, Realm crea automáticamente un módulo que contiene todos los objetos de Realm definidos en la aplicación. Se puede definir un módulo de Realm para restringir un dominio a un subconjunto de clases definidas en la aplicación. Si se crea una biblioteca que utiliza Realm, se puede usar un módulo de Realm para incluir explícitamente en el dominio solo los objetos de Realm definidos en la biblioteca. Esto permite que las aplicaciones que incluyen la biblioteca también utilicen Realm sin tener que gestionar conflictos de nombres de objeto ni migraciones con los objetos de Realm definidos en la biblioteca.