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

CRUD — Excluir — Swift SDK

Nesta página

  • Excluir objetos de Realm
  • Sobre os exemplos nesta página
  • Excluir um objeto
  • Excluir vários objetos
  • Excluir um objeto e seus objetos relacionados
  • Exclua todos os objetos de um tipo específico
  • Excluir todos os objetos em um Realm
  • Exclua valores/chaves de mapa
  • Exclua elementos do MutableSet
  • Exclua o valor de um AnyRealmValue
  • Exclua um objeto de forma assíncrona

A exclusão de objetos de Realm deve ocorrer nas transações de gravação. Para obter mais informações sobre como gravar transações, consulte: Transações.

Se você quiser excluir o próprio arquivo de Realm, consulte: Exclua um Realm.

Importante

Não use objetos após excluir

Você não pode acessar ou modificar um objeto depois de excluí-lo de um realm. Se tentar usar um objeto excluído, o Realm exibirá um erro.

Os exemplos nesta página usam os seguintes modelos:

// DogToy.h
@interface DogToy : RLMObject
@property NSString *name;
@end
// Dog.h
@interface Dog : RLMObject
@property NSString *name;
@property int age;
@property NSString *color;
// To-one relationship
@property DogToy *favoriteToy;
@end
// Enable Dog for use in RLMArray
RLM_COLLECTION_TYPE(Dog)
// Person.h
// A person has a primary key ID, a collection of dogs, and can be a member of multiple clubs.
@interface Person : RLMObject
@property int _id;
@property NSString *name;
// To-many relationship - a person can have many dogs
@property RLMArray<Dog *><Dog> *dogs;
// Inverse relationship - a person can be a member of many clubs
@property (readonly) RLMLinkingObjects *clubs;
@end
RLM_COLLECTION_TYPE(Person)
// DogClub.h
@interface DogClub : RLMObject
@property NSString *name;
@property RLMArray<Person *><Person> *members;
@end
// Dog.m
@implementation Dog
@end
// DogToy.m
@implementation DogToy
@end
// Person.m
@implementation Person
// Define the primary key for the class
+ (NSString *)primaryKey {
return @"_id";
}
// Define the inverse relationship to dog clubs
+ (NSDictionary *)linkingObjectsProperties {
return @{
@"clubs": [RLMPropertyDescriptor descriptorWithClass:DogClub.class propertyName:@"members"],
};
}
@end
// DogClub.m
@implementation DogClub
@end
class Dog: Object {
@Persisted var name = ""
@Persisted var age = 0
@Persisted var color = ""
@Persisted var currentCity = ""
@Persisted var citiesVisited: MutableSet<String>
@Persisted var companion: AnyRealmValue
// Map of city name -> favorite park in that city
@Persisted var favoriteParksByCity: Map<String, String>
}

To delete an object from a realm, pass the object to -[RLMRealm deleteObject:] inside of a write transaction.

[realm transactionWithBlock:^() {
// Delete the instance from the realm.
[realm deleteObject:dog];
}];

Para excluir um objeto de um domínio, passe o objeto para Realm.delete(_:) dentro de uma transação de gravação.

// Previously, we've added a dog object to the realm.
let dog = Dog(value: ["name": "Max", "age": 5])
let realm = try! Realm()
try! realm.write {
realm.add(dog)
}
// Delete the instance from the realm.
try! realm.write {
realm.delete(dog)
}

Novidades na versão 10,19,0.

Para excluir uma coleção de objetos de um domínio, passe a coleção para Realm.delete(_:) dentro de uma transação de gravação.

let realm = try! Realm()
try! realm.write {
// Find dogs younger than 2 years old.
let puppies = realm.objects(Dog.self).where {
$0.age < 2
}
// Delete the objects in the collection from the realm.
realm.delete(puppies)
}

Para excluir uma coleção de objetos de um domínio, passe a coleção para Realm.delete(_:) dentro de uma transação de gravação.

let realm = try! Realm()
try! realm.write {
// Find dogs younger than 2 years old.
let puppies = realm.objects(Dog.self).filter("age < 2")
// Delete the objects in the collection from the realm.
realm.delete(puppies)
}

Para excluir uma coleção de objetos de um domínio, passe a coleção para -[Realm deleteObjects:] dentro de uma transação de escrita.

RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^() {
// Find dogs younger than 2 years old.
RLMResults<Dog *> *puppies = [Dog objectsInRealm:realm where:@"age < 2"];
// Delete all objects in the collection from the realm.
[realm deleteObjects:puppies];
}];

Às vezes, você deseja excluir objetos relacionados quando exclui o objeto pai. Chamamos isso de exclusão de encadeamento. O Realm não exclui os objetos relacionados para você. Se você mesmo não excluir os objetos, eles permanecerão órfãos em seu Realm. Se isso causará ou não um problema, dependerá das necessidades do seu aplicativo.

A melhor maneira de excluir objetos dependentes é fazer a iteração por meio das dependências e excluí-los antes de excluir o objeto pai.

[realm transactionWithBlock:^() {
// Delete Ali's dogs.
[realm deleteObjects:[ali dogs]];
// Delete Ali.
[realm deleteObject:ali];
}];
let person = realm.object(ofType: Person.self, forPrimaryKey: 1)!
try! realm.write {
// Delete the related collection
realm.delete(person.dogs)
realm.delete(person)
}

Para excluir todos os objetos de um determinado tipo de objeto de um domínio, passe o resultado de +[ YourRealmObjectClass allObjectsInRealm:] para -[Realm deleteObjects:] dentro de uma transação de escrita. Substitua YourRealmObjectClass pelo nome da classe de objeto de Realm.

RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^() {
// Delete all instances of Dog from the realm.
RLMResults<Dog *> *allDogs = [Dog allObjectsInRealm:realm];
[realm deleteObjects:allDogs];
}];

Para excluir todos os objetos de um determinado tipo de objeto de um domínio, passe o resultado de Realm.objects(_:) do tipo que você deseja excluir para Realm.delete(_:) dentro de uma transação de gravação.

let realm = try! Realm()
try! realm.write {
// Delete all instances of Dog from the realm.
let allDogs = realm.objects(Dog.self)
realm.delete(allDogs)
}

Para excluir todos os objetos do domínio, ligue para -[RLLMRealm deleteAllObjects] dentro de uma transação de escrita. Isso limpa o domínio de todas as instâncias de objeto, mas não afeta o esquema do domínio.

RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^() {
// Delete all objects from the realm.
[realm deleteAllObjects];
}];

Para excluir todos os objetos do domínio, chame Realm.deleteAll() dentro de uma transação de gravação. Isso limpa o realm de todas as instâncias de objeto, mas não afeta o esquema do realm.

let realm = try! Realm()
try! realm.write {
// Delete all objects from the realm.
realm.deleteAll()
}

Você pode excluir entradas de mapa de algumas maneiras:

  • Use removeObject(for:) para remover a chave e o valor

  • Se o valor do dicionário for opcional, você poderá definir o valor da chave como nil para manter a chave.

let realm = try! Realm()
// Find the dog we want to update
let wolfie = realm.objects(Dog.self).where {
$0.name == "Wolfie"
}.first!
// Delete an entry
try! realm.write {
// Use removeObject(for:)
wolfie.favoriteParksByCity.removeObject(for: "New York")
// Or assign `nil` to delete non-optional values.
// If the value type were optional (e.g. Map<String, String?>)
// this would assign `nil` to that entry rather than deleting it.
wolfie.favoriteParksByCity["New York"] = nil
}
XCTAssertNil(wolfie.favoriteParksByCity["New York"])

Você pode excluir elementos específicos de um MutableSet ou limpar todos os elementos do conjunto. Se estiver trabalhando com vários conjuntos, também poderá remover elementos de um conjunto do outro conjunto; consulte: Atualize uma propriedade do MutableSet.

let realm = try! Realm()
// Record a dog's name and list of cities he has visited.
let dog = Dog()
dog.name = "Maui"
let dogCitiesVisited = ["New York", "Boston", "Toronto"]
try! realm.write {
realm.add(dog)
dog.citiesVisited.insert(objectsIn: dogCitiesVisited)
}
XCTAssertEqual(dog.citiesVisited.count, 3)
// Later... we decide the dog didn't really visit Toronto
// since the plane just stopped there for a layover.
// Remove the element from the set.
try! realm.write {
dog.citiesVisited.remove("Toronto")
}
XCTAssertEqual(dog.citiesVisited.count, 2)
// Or, in the case where the person entered the data for
// the wrong dog, remove all elements from the set.
try! realm.write {
dog.citiesVisited.removeAll()
}
XCTAssertEqual(dog.citiesVisited.count, 0)

Para excluir o valor de um AnyRealmValue, defina-o como .none.

let realm = try! Realm()
// Wolfie's companion is "Fluffy the Cat", represented by a string.
// Fluffy has gone to visit friends for the summer, so Wolfie has no companion.
let wolfie = realm.objects(Dog.self).where {
$0.name == "Wolfie"
}.first!
try! realm.write {
// You cannot set an AnyRealmValue to nil; you must set it to `.none`, instead.
wolfie.companion = .none
}

Você pode usar os recursos de simultaneidade do Swift para excluir objetos de forma assíncrona usando um Realm isolado por atores.

Essa função do exemplo RealmActor definida na página Use o Realm com atores mostra como excluir um objeto em um Realm isolado por atores:

func deleteTodo(id: ObjectId) async throws {
try await realm.asyncWrite {
let todoToDelete = realm.object(ofType: Todo.self, forPrimaryKey: id)
realm.delete(todoToDelete!)
}
}

E você pode fazer essa exclusão usando a sintaxe assíncrona do Swift:

let actor = try await RealmActor()
let todoId = await actor.getObjectId(forTodoNamed: "Keep Mr. Frodo safe from that Gollum")
try await actor.deleteTodo(id: todoId)
let updatedTodoCount = await actor.count
if updatedTodoCount == todoCount - 1 {
print("Successfully deleted the todo")
}

Esta operação não bloqueia nem executa E/S no thread de chamada. Para obter mais informações sobre como gravar no Realm usando os recursos de simultaneidade do Swift, consulte Use o Realm com atores — Swift SDK.

Voltar

Update

Próximo

Segmentação