CRUD - Atualização - C++ SDK
Nesta página
As atualizações para Objeto de Realm devem ocorrer na transação de escrita. Para obter mais informações sobre transação de escrita, consulte: transação de escrita.
Atualizar um objeto
Você pode modificar a propriedade de um Objeto de Realm dentro de uma transação de escrita.
// Query for the object you want to update auto dogs = realm.objects<realm::Dog>(); auto dogsNamedMaui = dogs.where([](auto &dog) { return dog.name == "Maui"; }); CHECK(dogsNamedMaui.size() >= 1); // Access an object in the results set. auto maui = dogsNamedMaui[0]; std::cout << "Dog " << maui.name.detach() << " is " << maui.age.detach() << " years old\n"; // Assign a new value to a member of the object in a write transaction int64_t newAge = 2; realm.write([&] { maui.age = newAge; });
Modelo
Este exemplo utiliza o seguinte modelo:
struct Dog { std::string name; int64_t age; }; REALM_SCHEMA(Dog, name, age)
Atualizar uma propriedade de objeto incorporado
Para atualizar uma propriedade em um objeto integrado, modifique a propriedade em uma transação de gravação.
auto managedBusinesses = realm.objects<realm::Business>(); auto businessesNamedMongoDB = managedBusinesses.where( [](auto &business) { return business.name == "MongoDB"; }); CHECK(businessesNamedMongoDB.size() >= 1); auto mongoDB = businessesNamedMongoDB[0]; realm.write( [&] { mongoDB.contactDetails->emailAddress = "info@example.com"; }); std::cout << "New email address: " << mongoDB.contactDetails->emailAddress.detach() << "\n";
Modelo
Este exemplo utiliza o seguinte modelo:
namespace realm { struct ContactDetails { // Because ContactDetails is an embedded object, it cannot have its own _id // It does not have a lifecycle outside of the top-level object std::string emailAddress; std::string phoneNumber; }; REALM_EMBEDDED_SCHEMA(ContactDetails, emailAddress, phoneNumber) struct Business { realm::object_id _id; std::string name; ContactDetails *contactDetails; }; REALM_SCHEMA(Business, _id, name, contactDetails) } // namespace realm
Substituir uma propriedade de objeto incorporado
Para substituir um objeto incorporado, reatribua a propriedade do objeto incorporado ao ponteiro bruto de uma nova instância em uma transação de gravação.
auto businesses = realm.objects<realm::Business>(); auto mongoDBBusinesses = businesses.where( [](auto &business) { return business.name == "MongoDB"; }); auto theMongoDB = mongoDBBusinesses[0]; realm.write([&] { auto newContactDetails = realm::ContactDetails{ .emailAddress = "info@example.com", .phoneNumber = "234-567-8901"}; // Overwrite the embedded object theMongoDB.contactDetails = &newContactDetails; });
Modelo
Este exemplo utiliza o seguinte modelo:
auto managedBusinesses = realm.objects<realm::Business>(); auto businessesNamedMongoDB = managedBusinesses.where( [](auto &business) { return business.name == "MongoDB"; }); CHECK(businessesNamedMongoDB.size() >= 1); auto mongoDB = businessesNamedMongoDB[0]; realm.write( [&] { mongoDB.contactDetails->emailAddress = "info@example.com"; }); std::cout << "New email address: " << mongoDB.contactDetails->emailAddress.detach() << "\n";
Atualizar uma relação inversa
Não é possível atualizar uma propriedade de relacionamento inversa diretamente. Em vez disso, uma relação inversa atualiza automaticamente alterando a atribuição através do seu objeto relacionado relevante.
Neste exemplo, um objeto Person
tem um relacionamento para-um com um objeto Dog
e Dog
tem um relacionamento inverso com Person
. O relacionamento inverso é atualizado automaticamente quando o objeto Person
atualiza seu relacionamento Dog
.
auto config = realm::db_config(); auto realm = realm::db(std::move(config)); auto dog = realm::Dog{.name = "Wishbone"}; auto [joe] = realm.write([&realm]() { auto person = realm::Person{.name = "Joe", .age = 27, .dog = nullptr}; return realm.insert(std::move(person)); }); realm.write([&dog, joe = &joe]() { joe->dog = &dog; }); // After assigning `&dog` to jack's `dog` property, // the backlink automatically updates to reflect // the inverse relationship through the dog's `owners` // property. CHECK(joe.dog->owners.size() == 1);
Modelo
Este exemplo utiliza o seguinte modelo:
struct Dog; struct Person { realm::primary_key<int64_t> _id; std::string name; int64_t age = 0; Dog* dog; }; REALM_SCHEMA(Person, _id, name, age, dog) struct Dog { realm::primary_key<int64_t> _id; std::string name; int64_t age = 0; linking_objects<&Person::dog> owners; }; REALM_SCHEMA(Dog, _id, name, age, owners)
Atualizar uma propriedade de mapa
É possível atualizar uma propriedade de mapa de Realm como faria com um mapa C++ padrão:
// You can check that a key exists using `find` auto findTuesday = tommy.locationByDay.find("Tuesday"); if (findTuesday != tommy.locationByDay.end()) realm.write([&] { tommy.locationByDay["Tuesday"] = realm::Employee::WorkLocation::HOME; }); ;
Modelo
Este exemplo utiliza o seguinte modelo:
namespace realm { struct Employee { enum class WorkLocation { HOME, OFFICE }; int64_t _id; std::string firstName; std::string lastName; std::map<std::string, WorkLocation> locationByDay; }; REALM_SCHEMA(Employee, _id, firstName, lastName, locationByDay) } // namespace realm
Atualizar uma propriedade de conjunto
Você pode atualizar uma propriedade definida em uma transação de gravação. Você pode .insert()
elementos no conjunto, erase()
elementos de um conjunto ou usar algoritmos std::set
para mutar conjuntos:
// Add elements to the set in a write transaction realm.write([&] { managedDocsRealm.openPullRequestNumbers.insert(3066); }); CHECK(managedDocsRealm.openPullRequestNumbers.size() == 4); // Use std::set algorithms to update a set // In this example, use std::set_union to add elements to the set // 3064 already exists, so it won't be added, but 3065 and 3067 are // unique values and will be added to the set. auto newOpenPullRequests = std::set<int64_t>({3064, 3065, 3067}); realm.write([&] { std::set_union( docsRealm.openPullRequestNumbers.begin(), docsRealm.openPullRequestNumbers.end(), newOpenPullRequests.begin(), newOpenPullRequests.end(), std::inserter(managedDocsRealm.openPullRequestNumbers, managedDocsRealm.openPullRequestNumbers.end())); }); CHECK(managedDocsRealm.openPullRequestNumbers.size() == 6); // Erase elements from a set auto it3065 = managedDocsRealm.openPullRequestNumbers.find(3065); CHECK(it3065 != managedDocsRealm.openPullRequestNumbers.end()); realm.write([&] { managedDocsRealm.openPullRequestNumbers.erase(it3065); });
Modelo
Este exemplo utiliza o seguinte modelo:
namespace realm { struct Repository { std::string ownerAndName; std::set<int64_t> openPullRequestNumbers; }; REALM_SCHEMA(Repository, ownerAndName, openPullRequestNumbers) } // namespace realm