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.
Operaciones de borrar
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) } } }
Objetos y referencias relacionados
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.
Encadenar eliminaciones con objetos Realm relacionados
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.
Eliminar objetos del reino
Para eliminar objetos específicos de un reino:
Abra una transacción de escritura con realm.write() o realm.writeBlocking().
Obtenga los objetos activos consultando el ámbito mutable de la transacción para los objetos que desea eliminar usando query():
Especifique el tipo de objeto como un parámetro de tipo pasado a
query().(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().Pase el conjunto de RealmResults devuelto por la consulta a mutableRealm.delete().
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.
Eliminar un solo objeto
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) }
Eliminar varios objetos
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) }
Eliminar todos los objetos de un tipo
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) }
Eliminar todos los objetos en un reino
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 objetos relacionados
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) }
Eliminar un objeto y sus objetos relacionados
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) } }
Eliminar un objeto incrustado
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().
Eliminar elementos de las colecciones
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.
Eliminar elementos de una RealmList
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) }
Eliminar elementos de un RealmSet
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) }
Eliminar claves/valores del diccionario
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()) }
Eliminar valor de propiedad RealmAny (Mixto)
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 }