Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ / /

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.

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) }
}
}

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.

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.

Para excluir objetos específicos de um domínio:

  1. Abra uma transação de gravação com realm.write() ou realm.writeBlocking().

  2. Obtenha os objetos ativos consultando o realm mutável da transação para os objetos que você deseja excluir usando query():

    1. Especifique o tipo de objeto como um parâmetro de tipo passado para query().

    2. (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().

  3. Passe o conjunto de RealmResults retornado pela query para mutableRealm.delete().

  4. 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.

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)
}

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)
}

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)
}

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.

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)
}

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)
}
}

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().

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.

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)
}

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)
}

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())
}

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
}

Voltar

Update