Docs Menu
Docs Home
/ /
Realm

Configurar y abrir un dominio - SDK de Kotlin

Esta página describe los archivos de dominio y cómo configurar, abrir y cerrar un dominio que solo conserva datos localmente. Para abrir un dominio que sincronice datos con Atlas mediante Sincronización de dispositivos, consulte Abrir un dominio sincronizado.

Un reino es la estructura de datos principal que se utiliza para organizar los datos en Realm. Cada reino es una colección de objetos de Realm: los objetos que utiliza en su aplicación, así como los metadatos adicionales que los describen. Cada tipo de objeto de Realm tiene un esquema de objetos basado en el modelo de objetos definido.

Un esquema de dominio es una lista de los esquemas de objetos válidos que un dominio puede contener. El esquema se especifica al abrir el dominio. Si un dominio ya contiene datos al abrirlo, Realm valida cada objeto para garantizar que se haya proporcionado un esquema de objeto para su tipo y que cumpla con todas las restricciones especificadas en el esquema.

Realm almacena una versión codificada en binario de cada objeto y tipo en un reino en un solo .realm Archivo. Al abrir un dominio, Realm crea el archivo .realm si aún no existe. El archivo se encuentra en una ruta específica, que puedes definir al abrir el dominio.

Tip

Trabajar con archivos de Realm en Realm Studio

Puede abrir, ver y editar el contenido de los archivos de reino con Realm Studio.

Si no desea crear un archivo .realm ni sus archivos auxiliares asociados, puede abrir un dominio en memoria. Consulte la Abra una sección de Reino en memoria para obtener más información.

Realm crea archivos adicionales para cada reino:

  • archivos de reino, con el sufijo "reino", pordefault.realm ejemplo: contienen datos de objetos.

  • Archivos de bloqueo, con el sufijo "lock", p. ej.: default.realm.lock registran las versiones de datos de un dominio que se utilizan activamente. Esto evita que el dominio recupere espacio de almacenamiento que aún utiliza una aplicación cliente.

  • archivos de notas, con el sufijo "nota", p. ej.: default.realm.note habilitan notificaciones entre subprocesos y entre procesos.

  • archivos de gestión, con el sufijo "gestión", pordefault.realm.management ejemplo: gestión del estado interno.

Eliminar estos archivos tiene implicaciones importantes. Para obtener más información sobre cómo .realm eliminar o archivos auxiliares, consulte: Eliminar un dominio.

Para abrir un reino, cree un objeto RealmConfiguration que defina sus detalles. Luego, pase el resultado RealmConfiguration a Realm.open().

Puede abrir un dominio con valores de configuración predeterminados o crear un RealmConfiguration con opciones de configuración adicionales. Sin embargo,debe pasar un parámetro de esquema que incluya todas las clases de objeto que desea usar en el dominio.

Después de abrir el reino con la configuración deseada, puede leer y escribir datos según el esquema definido.

Los ejemplos de esta página se refieren a los siguientes objetos Realm:

class Frog : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
}
class Person : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
}

Para abrir un dominio con valores de configuración predeterminados, use el método RealmConfiguration.create(). Solo necesita definir un conjunto de clases de objeto como esquema del dominio. Luego, pase el RealmConfiguration a Realm.open().

El siguiente ejemplo abre un archivo default.realm en la ruta predeterminada con un esquema que incluye las clases Frog y Person:

// Creates a realm with default configuration values
val config = RealmConfiguration.create(
// Pass object classes for the realm schema
schema = setOf(Frog::class, Person::class)
)
// Open the realm with the configuration object
val realm = Realm.open(config)
Log.v("Successfully opened realm: ${realm.configuration.name}")
// ... use the open realm ...

Si no define un directorio para el archivo de dominio, se usará la ubicación de almacenamiento de aplicaciones predeterminada para la plataforma. Puede encontrar el directorio predeterminado para su plataforma con lo siguiente:

  • Android: Context.getFiles()

  • Máquina virtual Java: System.getProperty("user.dir")

  • macOS: platform.Foundation.NSFileManager.defaultManager.currentDirectoryPath

  • iOS:

    NSFileManager.defaultManager.URLForDirectory(
    NSDocumentDirectory,
    NSUserDomainMask,
    null,
    true,
    null
    )

Se puede abrir un dominio completamente en memoria, lo que no crea un archivo .realm ni sus archivos auxiliares asociados. En su lugar, el SDK almacena objetos en memoria mientras el dominio está abierto y descarta los datos cuando se cierran todas las instancias.

Para abrir un reino que se ejecuta sin escribirse en un archivo, cree un RealmConfiguration con RealmConfiguration.Builder usando la propiedad inMemory. Luego, pase el resultante RealmConfiguration a Realm.open():

// Create the in-memory realm configuration
val config = RealmConfiguration.Builder(
schema = setOf(Frog::class, Person::class)
)
.inMemory()
.build()
// Open the realm with the configuration object
val realm = Realm.open(config)
Log.v("Successfully opened an in-memory realm")
// ... use the open realm ...

Nota

Los reinos en memoria no se conservan

Dado que los dominios en memoria no se conservan, asegúrese de tener al menos una instancia abierta del dominio mientras desee acceder a los datos. Tras cerrar la última instancia de un dominio en memoria, los datos ya no estarán disponibles.

Puede agregar argumentos opcionales a RealmConfiguration para controlar los detalles del reino que desea abrir, incluidos:

Para obtener más información sobre implementaciones de configuración específicas, consulte Administrar archivos de Realm - Kotlin SDK.

Para configurar un dominio con valores no predeterminados, cree el RealmConfiguration mediante RealmConfiguration.Builder.build() y pase las propiedades que desee configurar. Luego, pase el resultante RealmConfiguration a Realm.open().

En el siguiente ejemplo, RealmConfiguration especifica un nombre y un directorio personalizados ("my-directory-path/myRealmName.realm") y una clave de cifrado:

// Create a realm configuration with configuration builder
// and pass all optional arguments
val config = RealmConfiguration.Builder(
schema = setOf(Frog::class, Person::class)
)
.name("myRealmName.realm")
.directory("my-directory-path")
.encryptionKey(myEncryptionKey)
.build()
// Open the realm with the configuration object
val realm = Realm.open(config)
Log.v("Successfully opened realm: ${realm.configuration.name}")
// ... use the open realm ...

Puedes agregar datos iniciales a un dominio mediante una llamada initialDataCallback. Esta llamada se activa al abrir el dominio por primera vez.

val config = RealmConfiguration.Builder(
schema = setOf(Frog::class, Person::class)
)
.initialData {
copyToRealm(Frog().apply { name = "Kermit" })
copyToRealm(Person().apply { name = "Jim Henson" })
}
.build()
val realm = Realm.open(config)
Log.v("Successfully opened realm: ${realm.configuration.name}")
// Opened realm includes the initial data
val initialFrog = realm.query<Frog>().find().first()
val initialPerson = realm.query<Person>().find().first()
Log.v("Realm initialized with: ${initialFrog.name} and ${initialPerson.name}")

Para encontrar la ruta del .realm archivo, utilice la propiedad realm.configuration.path:

val realmPath = realm.configuration.path
Log.v("Realm path: $realmPath")

Se cierra un dominio con realm.close(). Este método se bloquea hasta que se completen todas las transacciones de escritura en el dominio.

realm.close()

Advertencia

Cerrar reinos para evitar fugas de memoria

Es importante cerrar la instancia de tu reino para liberar recursos. No cerrar los reinos puede generar un error OutOfMemoryError.

Para copiar datos de un dominio existente a uno nuevo con diferentes opciones de configuración, pase la nueva configuración al método Realm.writeCopyTo(). Por ejemplo, podría copiar datos para hacer una copia de seguridad de un dominio local o para convertir un dominio sincronizado en uno local.

Puede copiar datos a un reino que use la misma configuración:

  • Realm local a realm local

  • De un reino en memoria a otro reino en memoria

  • Reino sincronizado con reino sincronizado

Puede copiar datos a un reino que utilice diferentes configuraciones de sincronización:

  • Realm local a realm de sincronización basada en partición

  • Reino sincronizado con el reino local

  • Reino sincronizado con un reino sincronizado para un usuario diferente

Advertencia

No se pueden copiar datos de un dominio local a un dominio de sincronización flexible. No se pueden copiar entre diferentes tipos de configuración de sincronización, por ejemplo, de sincronización basada en particiones a sincronización flexible.

También puede combinar cambios en la configuración. Por ejemplo, puede copiar datos de un dominio sincronizado en memoria sin cifrar a un dominio local cifrado.

Algunas consideraciones adicionales a tener en cuenta al utilizar Realm.writeCopyTo():

  • El archivo de destino no puede existir ya.

  • No se permite copiar un realm dentro de una transacción de escritura ni durante una migración.

  • Al usar Device Sync, debe sincronizar todos los cambios locales con el servidor antes de escribir la copia. Esto garantiza que el archivo pueda usarse como punto de partida para una aplicación recién instalada. Realm genera un error si hay cargas pendientes.

    Puede utilizar uploadAllLocalChanges() y downloadAllServerChanges() para garantizar que se completen todos los procesos de sincronización.

Ejemplo

Copiar datos del dominio de sincronización flexible al dominio local

// Instantiate the synced realm with your App ID
val app = App.create(YOUR_APP_ID)
runBlocking {
val user = app.login(credentials)
// Create the synced realm configuration
val syncConfig = SyncConfiguration.Builder(user, setOf(Frog::class))
.initialSubscriptions { realm ->
add(realm.query<Frog>(),"all-frogs")
}
.build()
// Open the synced realm and add data to it
val syncRealm = Realm.open(syncConfig)
Log.v("Successfully opened realm: ${syncRealm.configuration.name}")
syncRealm.write {
this.copyToRealm(Frog().apply {
name = "Kermit"
})
}
// Wait for write to sync
syncRealm.syncSession.uploadAllLocalChanges(30.seconds)
// Create the local realm
val localConfig = RealmConfiguration.Builder(setOf(Frog::class))
.name("local.realm")
.build()
// Copy data from synced realm to the new realm
syncRealm.writeCopyTo(localConfig)
// Close the synced realm when you're done copying
syncRealm.close()
// Open the new local realm
val localRealm = Realm.open(localConfig)
// Copied Frog object is available in the new realm
val frog = localRealm.query<Frog>().find().first()
Log.v("Copied Frog: ${frog.name}")
localRealm.close()
}

También puede incluir una nueva clave de cifrado en la configuración del reino copiado o eliminar la clave de cifrado de la nueva configuración.

Ejemplo

Copiar datos desde un Realm sin cifrar a un Realm cifrado

runBlocking {
// Create the unencrypted realm
val unencryptedConfig = RealmConfiguration.Builder(setOf(Frog::class))
.name("unencrypted.realm")
.build()
// Open the realm and add data to it
val unencryptedRealm = Realm.open(unencryptedConfig)
unencryptedRealm.write {
this.copyToRealm(Frog().apply {
name = "Kermit"
})
}
// ... Generate encryption key ...
// Create the encrypted realm
val encryptedConfig = RealmConfiguration.Builder(setOf(Frog::class))
.name("encrypted.realm")
.encryptionKey(encryptionKey)
.build()
// Copy data from `unencryptedRealm` to the new realm
// Data is encrypted as part of the copy process
unencryptedRealm.writeCopyTo(encryptedConfig)
// Close the original realm when you're done copying
unencryptedRealm.close()
// Open the new encrypted realm
val encryptedRealm = Realm.open(encryptedConfig)
// Copied Frog object is available in the new realm
val frog = encryptedRealm.query<Frog>().find().first()
Log.v("Copied Frog: ${frog.name}")
encryptedRealm.close()
}

Ejemplo

Copiar datos desde la memoria interna al dominio local

runBlocking {
// Create the in-memory realm
val inMemoryConfig = RealmConfiguration.Builder(setOf(Frog::class))
.name("inMemory.realm")
.inMemory()
.build()
// Open the realm and add data to it
val inMemoryRealm = Realm.open(inMemoryConfig)
inMemoryRealm.write {
this.copyToRealm(Frog().apply {
name = "Kermit"
})
}
// Create the local realm
val localConfig = RealmConfiguration.Builder(setOf(Frog::class))
.name("local.realm")
.build()
// Copy data from `inMemoryRealm` to the new realm
inMemoryRealm.writeCopyTo(localConfig)
// Close the original realm when you're done copying
inMemoryRealm.close()
// Open the new local realm
val localRealm = Realm.open(localConfig)
// Copied Frog object is available in the new realm
val frog = localRealm.query<Frog>().find().first()
Log.v("Copied Frog: ${frog.name}")
localRealm.close()
}

Volver

Datos del modelo con sincronización de dispositivos

En esta página