Docs Menu
Docs Home
/ /
Leer y escribir datos

Borrar objetos Realm - Kotlin SDK

Esta página describe cómo eliminar objetos de un reino local o sincronizado usando el SDK de Kotlin.

Puedes eliminar un solo objeto, varios o todos los objetos del dominio. Tras eliminar un objeto, ya no podrás acceder a él ni modificarlo. Si intentas usar un objeto eliminado, el dominio genera un error.

Eliminar objetos de un dominio no elimina el archivo del dominio ni afecta el esquema del dominio. Solo elimina la instancia del objeto. Si desea eliminar el archivo del dominio, consulte Eliminar un dominio - SDK de Kotlin.

Nota

Escribir en un reino sincronizado

La sintaxis para eliminar un objeto de un dominio es la misma para un dominio local o sincronizado. Sin embargo, existen consideraciones adicionales que determinan si la operación de eliminación en un dominio sincronizado se realiza correctamente. Para obtener más información, consulte Escribir datos en un dominio sincronizado - SDK de Kotlin.

Todas las operaciones que modifican un dominio, incluidas las de eliminación, deben realizarse dentro de una transacción de escritura. Las transacciones de escritura se pasan al dominio. Método write() o writeBlocking(). Con esta devolución de llamada, puede acceder a una instancia de MutableRealm y luego eliminar objetos dentro del dominio. Para obtener más información sobre las transacciones de escritura y cómo las gestiona Realm, consulte Transacciones de escritura.

Solo se pueden eliminar objetos activos, a los que solo se puede acceder dentro de una transacción de escritura. Se puede convertir un objeto congelado en activo en una transacción con mutableRealm.findLatest().

Ejemplo

Convertir objeto congelado antes de eliminarlo

val frozenFrog = realm.query<Frog>("name == $0", "Kermit").find().firstOrNull()
// Open a write transaction
realm.writeBlocking {
// Get the live frog object with findLatest(), then delete it
if (frozenFrog != null) {
findLatest(frozenFrog)
?.also { delete(it) }
}
}

Al eliminar un objeto que tiene una propiedad de relación con otro objeto, Realm no elimina automáticamente la instancia del objeto relacionado. En su lugar, solo elimina la referencia al otro objeto. El objeto referenciado permanece en el dominio, pero ya no se puede consultar a través de la propiedad principal.

La única excepción es si el objeto relacionado está incrustado. Cuando se elimina un objeto que tiene una relación con un EmbeddedRealmObjectRealm elimina automáticamente el objeto incrustado mediante una eliminación en cascada. Para obtener más información, consulte la sección "Eliminar un objeto incrustado" en esta página.

Si desea eliminar objetos relacionados al eliminar un objeto principal, le recomendamos realizar una eliminación encadenada. Esta eliminación consiste en eliminar manualmente los objetos dependientes iterando sobre las dependencias y eliminándolos antes de eliminar el objeto principal. Para obtener más información sobre las eliminaciones encadenadas, consulte la sección "Eliminar un objeto y sus objetos relacionados" en esta página.

Si no elimina los objetos relacionados, estos permanecerán huérfanos en su dominio. Que esto sea un problema depende de las necesidades de su aplicación.

Para eliminar objetos específicos de un reino:

  1. Abra una transacción de escritura con realm.write() o realm.writeBlocking().

  2. Obtenga los objetos activos consultando el ámbito mutable de la transacción para los objetos que desea eliminar usando query():

    1. Especifique el tipo de objeto como un parámetro de tipo pasado a query().

    2. (Opcional) Filtre el conjunto de objetos devueltos especificando una consulta. Si no incluye un filtro de consulta, se devuelven todos los objetos del tipo especificado. Para obtener más información sobre las consultas con el SDK de Kotlin, consulte Leer objetos de dominio - SDK de Kotlin.

    Importante

    Los objetos deben estar vivos

    Solo se pueden eliminar objetos activos. Si la consulta se produce fuera de la transacción de escritura, debe convertir los objetos congelados en activos en la transacción con mutableRealm.findLatest().

  3. Pase el conjunto de RealmResults devuelto por la consulta a mutableRealm.delete().

  4. Los objetos especificados se eliminan del dominio y ya no se puede acceder a ellos ni modificarlos. Si intenta usar un objeto eliminado, el dominio genera un error.

    Si algún objeto eliminado tenía una relación con otro objeto, Realm solo elimina la referencia a este. El objeto referenciado permanece en el dominio, pero ya no se puede consultar a través de la propiedad principal eliminada. Consulte la sección "Eliminar un objeto y sus objetos relacionados" para obtener más información.

Tip

Puedes comprobar si un objeto sigue siendo válido llamando a isValid(). Los objetos eliminados false devuelven.

Para eliminar un solo objeto RealmObject, consulte el tipo de objeto utilizando un filtro que devuelva el objeto específico que desea eliminar.

Tip

Utilice información de identificación única

Recomendamos filtrar con información de identificación única, como un valor de clave principal, para garantizar que su consulta devuelva el objeto correcto.

En el siguiente ejemplo, consultamos un objeto Frog con una clave principal específica y luego pasamos el objeto devuelto a mutableRealm.delete() para eliminarlo del reino:

// Open a write transaction
realm.write {
// Query the Frog type and filter by primary key value
val frogToDelete: Frog = query<Frog>("_id == $0", PRIMARY_KEY_VALUE).find().first()
// Pass the query results to delete()
delete(frogToDelete)
}

Para eliminar varios objetos al mismo tiempo, pase el tipo de objeto a query() y especifique una consulta que devuelva todos los objetos que desea eliminar.

En el siguiente ejemplo, consultamos los primeros tres objetos Frog cuyo species es "bullfrog" y luego pasamos los resultados a mutableRealm.delete() para eliminarlos del reino:

// Open a write transaction
realm.write {
// Query by species and limit to 3 results
val bullfrogsToDelete: RealmResults<Frog> = query<Frog>("species == 'bullfrog' LIMIT(3)").find()
// Pass the query results to delete()
delete(bullfrogsToDelete)
}

Para eliminar todos los objetos de un tipo específico de un reino al mismo tiempo, pase el tipo de objeto a query() y deje el filtro de consulta vacío para devolver todos los objetos de ese tipo.

En el siguiente ejemplo, consultamos todos los objetos Frog y luego pasamos los resultados a mutableRealm.delete() para eliminarlos todos del reino:

// Open a write transaction
realm.write {
// Query Frog type with no filter to return all frog objects
val frogsLeftInTheRealm = query<Frog>().find()
// Pass the query results to delete()
delete(frogsLeftInTheRealm)
}

El SDK de Kotlin permite eliminar todos los objetos administrados de cualquier tipo, lo cual resulta útil para vaciar rápidamente el dominio durante el prototipado. Esto no afecta al esquema del dominio ni a los objetos que no estén administrados por él.

Para eliminar todos los objetos del realm al mismo tiempo, llama a mutableRealm.deleteAll(). Esto borra todos los objetos de todos los tipos.

En el siguiente ejemplo, eliminamos todos los objetos del reino con deleteAll():

// Open a write transaction
realm.write {
// Delete all objects from the realm
deleteAll()
}

Tip

Utilice deleteAll() en desarrollo

El método deleteAll() es útil para vaciar rápidamente el entorno durante el desarrollo. Por ejemplo, en lugar de escribir una migración para actualizar los objetos a un nuevo esquema, puede ser más rápido eliminarlos todos y luego regenerarlos con la propia aplicación.

Eliminar un objeto principal no elimina automáticamente los objetos relacionados con él, a menos que este esté incrustado. Realm solo elimina la referencia al objeto relacionado.

En el siguiente ejemplo, tenemos un objeto Frog con una lista de Pond objetos. Tras eliminar el objeto Frog, confirmamos que los Pond objetos permanecen en el dominio:

// Open a write transaction
realm.write {
// Query for the parent frog object with ponds
val parentObject = query<Frog>("_id == $0", PRIMARY_KEY_VALUE).find().first()
assertEquals(2, parentObject.favoritePonds.size)
// Delete the frog and all references to ponds
delete(parentObject)
// Confirm pond objects are still in the realm
val ponds = query<Pond>().find()
assertEquals(2, ponds.size)
}

Para eliminar objetos relacionados al eliminar un objeto principal, debe eliminarlos manualmente. Recomendamos encadenar las eliminaciones: primero, busque el objeto principal que desea eliminar, luego recorra las relaciones entre ambos y elimine cada objeto relacionado. Finalmente, elimine el objeto principal.

En el siguiente ejemplo, consultamos un objeto Frog llamado "Kermit", iteramos su propiedad favoritePonds y eliminamos cada objeto Pond. Después, eliminamos el objeto Frog:

realm.write {
// Query for the parent frog object with ponds
val frog = query<Frog>("name == $0", "Kermit").find().first()
val ponds = frog.favoritePonds
// Iterate over the list and delete each pond object
if (ponds.isNotEmpty()) {
ponds.forEach { pond ->
delete(pond)
}
}
// Delete the parent frog object
val frogToDelete = findLatest(frog)
if (frogToDelete != null) {
delete(frogToDelete)
}
}

Advertencia

Realm utiliza eliminaciones en cascada para objetos incrustados

Al eliminar un objeto Realm, Realm elimina automáticamente cualquier objeto incrustado referenciado por dicho objeto. Si desea que los objetos referenciados persistan tras la eliminación del objeto principal, utilice un objeto Realm normal con una relación de uno a uno.

Puede eliminar un objeto incrustado a través del objeto principal en una eliminación en cascada o eliminando el objeto incrustado directamente.

  • Para eliminar el objeto incrustado a través del objeto principal, obtenga y elimine el objeto principal. Realm elimina automáticamente todos sus objetos incrustados del reino.

  • Para eliminar una instancia de objeto incrustado directamente:

    • Obtener y eliminar un objeto incrustado específico.

    • Borra la referencia del padre al objeto incrustado, lo que también elimina la instancia del objeto incrustado.

En el siguiente ejemplo, tenemos un objeto Business con una lista de objetos EmbeddedAddress incrustados. Hacemos una query y borramos el objeto Business, lo que borra automáticamente todos sus objetos EmbeddedAddress integrados:

// Delete the parent object
realm.write {
val businessToDelete = query<Business>("name == $0", "Big Frog Corp.").find().first()
// Delete the parent object (deletes all embedded objects)
delete(businessToDelete)
}

En el siguiente ejemplo, tenemos objetos Contact con objetos EmbeddedAddress incrustados. Eliminamos un objeto EmbeddedAddress directamente y otro a través del objeto principal:

// Delete an embedded object directly
realm.write {
val addressToDelete = query<EmbeddedAddress>("street == $0", "456 Lily Pad Ln").find().first()
// Delete the embedded object (nullifies the parent property)
delete(addressToDelete)
}
// Delete an embedded object through the parent
realm.write {
val propertyToClear = query<Contact>("name == $0", "Kermit").find().first()
// Clear the parent property (deletes the embedded object instance)
propertyToClear.address = null
}

Tip

Obtener el padre del objeto incrustado

Puede obtener el padre único de un objeto incrustado utilizando parent().

Las instancias de colección de dominio que contienen objetos solo almacenan referencias a dichos objetos. Puede eliminar uno o más objetos referenciados de una colección sin eliminarlos. Los objetos que elimine de una colección permanecerán en el dominio hasta que los elimine manualmente. Como alternativa, al eliminar un objeto de dominio de un dominio, también se elimina ese objeto de cualquier instancia de colección que lo contenga.

Puede eliminar uno o más elementos en una sola transacción de una RealmList:

  • Para eliminar un elemento de la lista, pase el elemento a list.remove().

  • Para eliminar un elemento en un índice especificado en la lista, pase el índice a list.removeAt().

  • Para eliminar varios elementos de la lista, pase los elementos a list.removeAll().

También puedes eliminar todos los elementos de la lista a la vez llamando a list.clear().

En el siguiente ejemplo, tenemos un objeto Forest con una lista de Pond objetos. Eliminamos los elementos de la lista mediante una serie de operaciones hasta que la lista quede vacía:

// Open a write transaction
realm.write {
// Query for the parent forest object
val forest = query<Forest>("name == $0", "Hundred Acre Wood").find().first()
val forestPonds = forest.nearbyPonds
assertEquals(5, forestPonds.size)
// Remove the first pond in the list
val removeFirstPond = forestPonds.first()
forestPonds.remove(removeFirstPond)
assertEquals(4, forestPonds.size)
// Remove the pond at index 2 in the list
forestPonds.removeAt(2)
assertEquals(3, forestPonds.size)
// Remove the remaining three ponds in the list
forestPonds.removeAll(forestPonds)
assertEquals(0, forestPonds.size)
}

En el siguiente ejemplo, tenemos un objeto Forest con una lista de Pond objetos. Eliminamos todos los elementos de la lista con el método list.clear():

// Open a write transaction
realm.write {
val forest = query<Forest>("name == $0", "Hundred Acre Wood").find().first()
val forestPonds = forest.nearbyPonds
assertEquals(5, forestPonds.size)
// Clear all ponds from the list
forestPonds.clear()
assertEquals(0, forestPonds.size)
}

Puedes remover uno o más elementos en una sola transacción desde un RealmSet:

  • Para eliminar un elemento del conjunto, pase el elemento que desea eliminar a set.remove().

  • Para eliminar varios elementos del conjunto, pase los elementos que desea eliminar a set.removeAll().

También puedes eliminar todos los elementos del conjunto a la vez llamando set.clear().

En el siguiente ejemplo, tenemos un objeto Frog con un conjunto de objetos Snack. Eliminamos los elementos del conjunto mediante una serie de operaciones hasta que el conjunto quede vacío:

// Open a write transaction
realm.write {
// Query for the parent frog object
val myFrog = query<RealmSet_Frog>("name == $0", "Kermit").find().first()
val snackSet = myFrog.favoriteSnacks
assertEquals(3, snackSet.size)
// Remove one snack from the set
snackSet.remove(snackSet.first { it.name == "Flies" })
assertEquals(2, snackSet.size)
// Remove the remaining two snacks from the set
val allSnacks = findLatest(myFrog)!!.favoriteSnacks
snackSet.removeAll(allSnacks)
assertEquals(0, snackSet.size)
}

En el siguiente ejemplo, tenemos un objeto Frog con un conjunto de objetos Snack. Eliminamos todos los elementos del conjunto con el método set.clear():

realm.write {
val myFrog = realm.query<RealmSet_Frog>("name == $0", "Kermit").find().first()
val snackSet = findLatest(myFrog)!!.favoriteSnacks
assertEquals(3, snackSet.size)
// Clear all snacks from the set
snackSet.clear()
assertEquals(0, snackSet.size)
}

Puedes eliminar entradas de RealmDictionary de varias maneras:

  • Para eliminar el valor pero conservar la clave, establezca la clave en null (el valor del diccionario debe ser nulo)

  • Para eliminar la clave y el valor, pasa la clave a remover()

También puedes eliminar todas las claves y valores llamando a clear().

En el siguiente ejemplo, tenemos un objeto Frog con un diccionario de valores String. Eliminamos los elementos del diccionario mediante una serie de operaciones hasta que el diccionario quede vacío:

// Find frogs who have forests with favorite ponds
val thisFrog = realm.query<Frog>("favoritePondsByForest.@count > 1").find().first()
// Set an optional value for a key to null if the key exists
if (thisFrog.favoritePondsByForest.containsKey("Hundred Acre Wood")) {
realm.write {
val mutableFrog = findLatest(thisFrog)
if (mutableFrog != null) {
mutableFrog.favoritePondsByForest["Hundred Acre Wood"] = null
}
}
}
realm.write {
// Remove a key and its value
findLatest(thisFrog)?.favoritePondsByForest?.remove("Lothlorien")
// Remove all keys and values
findLatest(thisFrog)?.favoritePondsByForest?.clear()
assertTrue(thisFrogUpdated.favoritePondsByForest.isEmpty())
}

Aunque RealmAny las instancias no pueden almacenar valores nulos, se puede eliminar un RealmAny valor de null propiedad asignándole directamente. Para obtener más información sobre el RealmAny tipo de dato, consulte RealmAny (Mixto).

En el siguiente ejemplo, tenemos un objeto Frog con una lista de propiedades RealmAny y borramos el primer valor de propiedad RealmAny:

realm.write {
val frog = query<Frog>().find().first()
frog.favoriteThings[0] = null
}

Volver

Update