Excluir objetos de domínio - Kotlin SDK
Nesta página
- Excluir operações
- Objetos e referências relacionados
- Excluir objetos de Realm
- Excluir um único objeto
- Excluir vários objetos
- Excluir todos os objetos de um tipo
- Excluir todos os objetos em um Realm
- Excluir objetos relacionados
- Excluir um objeto e seus objetos relacionados
- Excluir um objeto incorporado
- Remover Elementos das Coleções
- Remover Elementos de uma RealmList
- Remover Elementos de um RealmSet
- Remover chaves/valores do dicionário
- Excluir valor de propriedade RealmAny (Misto)
Esta página descreve como excluir objetos de um domínio local ou sincronizado usando o Kotlin SDK.
Você pode optar por excluir um único objeto, vários objetos ou todos os objetos do domínio. Depois de excluir um objeto, você não poderá mais acessá-lo ou modificá-lo. Se tentar usar um objeto excluído, o Realm exibirá um erro.
Excluir objetos de um domínio não exclui o arquivo de domínio ou afeta o esquema de domínio. Ele exclui apenas a instância do objeto do domínio. Se você quiser excluir o arquivo de realm em si, consulte Excluir um realm - Kotlin SDK.
Observação
Escreva para um domínio sincronizado
A sintaxe para excluir um objeto de um domínio é a mesma para um domínio local ou sincronizado. No entanto, há considerações adicionais que determinam se a operação de exclusão em um domínio sincronizado é bem-sucedida. Para obter mais informações, consulte Gravar dados em um domínio sincronizado - Kotlin SDK.
Excluir operações
Todas as operações que modificam um Realm — inclusive operações de exclusão — devem ser executadas dentro de uma transação de gravação. As transações de gravação são passadas para o método write () ou writeBlocking () do domínio. Nesse chamada de resposta de chamada, você pode acessar uma instância de MutableRealm e, em seguida, excluir objetos dentro do Realm. Para obter mais informações sobre transações de gravação e como o Realm as trata, consulte Transações de gravação.
Você só pode excluir objetos ativos, que só podem ser acessados dentro de uma transação de gravação. Você pode converter um objeto congelado em um objeto ativo em uma transação com mutableRealm.findLatest().
Exemplo
Converter objeto congelado antes de excluir
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 e referências relacionados
Quando você exclui um objeto que tem uma propriedade de relacionamento com outro objeto, o Realm não exclui automaticamente a instância do objeto relacionado. Em vez disso, o Realm exclui apenas a referência ao outro objeto. O objeto referenciado permanece no domínio, mas não pode mais ser querydo através da propriedade principal.
A única exceção é se o objeto relacionado estiver incorporado. Quando você exclui um objeto que tem um relacionamento com um EmbeddedRealmObject
, a Realm exclui automaticamente o objeto incorporado em uma exclusão em cascata. Para obter mais informações, consulte a seção Excluir um objeto incorporado nesta página.
Encadeamento de exclusões com objetos de domínio relacionados
Se você quiser excluir qualquer objeto relacionado ao excluir um objeto pai , recomendamos executar uma exclusão de encadeamento. Uma exclusão de encadeamento consiste em excluir manualmente objetos dependentes iterando pelas dependências e excluindo-os antes de excluir o objeto principal. Para obter mais informações sobre exclusões em cadeia, consulte a seção Excluir um objeto e seus objetos relacionados nesta página.
Se você mesmo não excluir os objetos relacionados, eles permanecerão órfãos em seu realm. Se isso causará ou não um problema, dependerá das necessidades do seu aplicativo.
Excluir objetos de Realm
Para excluir objetos específicos de um domínio:
Abra uma transação de gravação com realm.write() ou realm.writeBlocking().
Obtenha os objetos ativos consultando o realm mutável da transação para os objetos que você deseja excluir usando query():
Especifique o tipo de objeto como um parâmetro de tipo passado para
query()
.(Opcional) Filtre o conjunto de objetos retornados especificando uma query. Se você não incluir um filtro de query, retornará todos os objetos do tipo especificado. Para obter mais informações sobre a query com o Kotlin SDK, consulte Read Realm Objects - Kotlin SDK.
Importante
Objetos devem estar ao vivo
Você só pode excluir objetos ao vivo. Se a query ocorrer fora da transação escrita, você deverá converter os objetos congelados em objetos ativos na transação com
mutableRealm.findLatest()
.Passe o conjunto de RealmResults retornado pela query para mutableRealm.delete().
Os objetos especificados são excluídos do domínio e não podem mais ser acessados ou modificados. Se tentar usar um objeto excluído, o Realm exibirá um erro.
Se algum objeto excluído tiver um relacionamento com outro objeto, o Realm excluirá apenas a referência ao outro objeto. O objeto referenciado permanece no Realm, mas não pode mais ser querydo através da propriedade pai excluída . Consulte a seção Excluir um objeto e seus objetos relacionados para obter mais informações.
Dica
Você pode verificar se um objeto ainda é válido para uso chamando isValid(). Objetos excluídos retornam false
.
Excluir um único objeto
Para excluir um único objeto RealmObject
, consulte o tipo de objeto usando um filtro que retorna o objeto específico que você deseja excluir.
Dica
Usar informações de identificação exclusivas
Recomendamos a filtragem com informações de identificação exclusivas, como um valor de chave primária, para garantir que sua query retorne o objeto correto.
No exemplo a seguir, querymos um objeto Frog
com uma chave primária específica e, em seguida, passamos o objeto retornado para mutableRealm.delete()
para excluí-lo do domínio:
// 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) }
Excluir vários objetos
Para excluir vários objetos ao mesmo tempo, passe o tipo de objeto para query()
e especifique uma query que retorna todos os objetos que você deseja excluir.
No exemplo a seguir, querymos os três primeiros objetos Frog
cujo species
é "rã-touro" e, em seguida, passamos os resultados para mutableRealm.delete()
para excluí-los do território:
// 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) }
Excluir todos os objetos de um tipo
Para excluir todos os objetos de um tipo específico de um domínio ao mesmo tempo, passe o tipo de objeto para query()
e deixe o filtro de query vazio para retornar todos os objetos desse tipo.
No exemplo a seguir, querymos todos os Frog
objetos e, em seguida, passamos os resultados para mutableRealm.delete()
para excluí-los todos do domínio:
// 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) }
Excluir todos os objetos em um Realm
O Kotlin SDK permite que você exclua todos os objetos gerenciados de todos os tipos, o que é útil para limpar rapidamente o seu domínio durante a criação de protótipos. Isso não afeta o esquema de domínio ou quaisquer objetos que não sejam gerenciados pelo domínio.
Para excluir todos os objetos do domínio ao mesmo tempo, chame mutableRealm.deleteAll(). Isso exclui todos os objetos de todos os tipos.
No exemplo a seguir, excluímos todos os objetos do domínio com deleteAll()
:
// Open a write transaction realm.write { // Delete all objects from the realm deleteAll() }
Dica
Usar deleteAll() em desenvolvimento
O método deleteAll()
é útil para limpar rapidamente seu domínio durante o desenvolvimento. Por exemplo, em vez de escrever uma migração para atualizar objetos para um novo esquema, pode ser mais rápido excluir todos e gerar novamente os objetos com o próprio aplicativo.
Excluir objetos relacionados
A exclusão de um objeto principal não exclui automaticamente nenhum objeto relacionado a ele, a menos que o objeto relacionado seja incorporado. Em vez disso, o Realm exclui apenas a referência ao objeto relacionado.
No exemplo a seguir, temos um objeto Frog
com uma lista de Pond
objetos. Depois de excluirmos o objeto Frog
, confirmamos que todos os objetos Pond
ainda permanecem no domínio:
// 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) }
Excluir um objeto e seus objetos relacionados
Para excluir objetos relacionados quando você exclui um objeto pai, você mesmo deve excluir manualmente os objetos relacionados. Recomendamos que as exclusões sejam encadeadas: primeiro, consulte o objeto principal que você deseja excluir e, em seguida, itere pelas relações do objeto pai e exclua cada objeto relacionado. Finalmente, exclua o próprio objeto principal.
No exemplo a seguir, querymos um objeto Frog
chamado "Kermit", depois iteramos pela propriedade favoritePonds
do objeto e excluímos cada objeto Pond
. Em seguida, excluímos o próprio 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) } }
Excluir um objeto incorporado
Aviso
O Realm usa exclusões em cascata para objetos embarcados
Quando você exclui um objeto de Realm, o Realm exclui automaticamente quaisquer objetos incorporados referenciados por esse objeto. Se você quiser que os objetos referenciados persistam após a exclusão do objeto pai, use um objeto de Realm normal com um relacionamento de um para um.
Você pode excluir um objeto incorporado por meio do objeto pai em uma exclusão em cascata ou excluindo o objeto incorporado diretamente.
Para excluir o objeto incorporado por meio do objeto pai, procure e exclua o objeto principal. O Realm exclui automaticamente todos os seus objetos incorporados do domínio.
Para excluir diretamente uma instância de objeto incorporado:
Buscar e excluir um objeto incorporado específico.
Limpe a referência dos pais ao objeto incorporado, o que também exclui a instância do objeto incorporado.
No exemplo a seguir, temos um objeto Business
com uma lista de objetos EmbeddedAddress
incorporados. Consultamos e excluímos o objeto Business
, que exclui automaticamente todos os seus objetos EmbeddedAddress
incorporados:
// 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) }
No exemplo a seguir, temos Contact
objetos com EmbeddedAddress
objetos incorporados. Excluímos um objeto EmbeddedAddress
diretamente e excluímos outro pelo objeto pai:
// 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 }
Dica
Obter principal do objeto incorporado
Você pode obter o pai exclusivo de um objeto incorporado usando parent().
Remover Elementos das Coleções
As instâncias de coleção de domínio que contêm objetos armazenam apenas referências a esses objetos. Você pode remover um ou mais objetos referenciados de uma coleção sem excluir os próprios objetos. Os objetos removidos de uma coleção permanecem na região até que você os exclua manualmente. Como alternativa, excluir um objeto de Realm de um realm também exclui esse objeto de qualquer instância de coleção que contenha o objeto.
Remover Elementos de uma RealmList
Você pode remover um ou mais elementos em uma única transação de uma RealmList:
Para remover um elemento da lista, passe o elemento para list.remove().
Para remover um elemento em um índice especificado na lista, passe o índice para list.removeAt().
Para remover vários elementos da lista, passe os elementos para list.removeAll().
Você também pode remover todos os elementos da lista de uma só vez, chamando list.clear().
No exemplo a seguir, temos um objeto Forest
com uma lista de Pond
objetos. Removemos os elementos da lista em uma série de operações até que a lista esteja vazia:
// 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) }
No exemplo a seguir, temos um objeto Forest
com uma lista de Pond
objetos. Removemos todos os elementos da lista com o 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) }
Remover Elementos de um RealmSet
Você pode remover um ou mais elementos em uma única transação de um RealmSet:
Para remover um elemento do conjunto, passe o elemento que pretende eliminar para set.remove().
Para remover vários elementos do conjunto, passe os elementos que você deseja excluir para set.removeAll().
Você também pode remover todos os elementos definidos de uma só vez chamando set.clear().
No exemplo a seguir, temos um objeto Frog
com um conjunto de Snack
objetos. Removemos os elementos do conjunto em uma série de operações até que o conjunto esteja vazio:
// 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) }
No exemplo a seguir, temos um objeto Frog
com um conjunto de Snack
objetos. Removemos todos os elementos definidos com o 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) }
Remover chaves/valores do dicionário
Você pode remover entradas do RealmDictionary de algumas maneiras:
Para remover o valor, mas manter a chave, defina a chave para
null
(o valor do dicionário deve ser anulável)Para remover a chave e o valor, passe a chave para remove()
Você também pode remover todas as chaves e valores chamando clear().
No exemplo a seguir, temos um objeto Frog
com um dicionário de valores String
. Removemos os elementos do dicionário em uma série de operações até que o dicionário esteja vazio:
// 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()) }
Excluir valor de propriedade RealmAny (Misto)
Embora RealmAny
instâncias não possam armazenar valores nulos, você pode excluir um valor de propriedade RealmAny
atribuindo null
diretamente à propriedade. Para mais informações sobre o tipo de dados do RealmAny
, consulte RealmQualquer (Misto).
No exemplo a seguir, temos um objeto Frog
com uma lista de propriedades RealmAny
e limpamos o primeiro valor RealmAny
propriedade:
realm.write { val frog = query<Frog>().find().first() frog.favoriteThings[0] = null }