CRUD - 업데이트 - C++ SDK
Realm 객체 업데이트는 쓰기 트랜잭션(write transaction) 내에서 이루어져야 합니다. 쓰기 트랜잭션(write transaction)에 대한 자세한 내용은 쓰기 트랜잭션(write transaction)을 참조하세요 .
객체 업데이트
쓰기 트랜잭션(write transaction) 내에서 Realm 객체의 속성을 수정할 수 있습니다.
// 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; });
모델
이 예제에서는 다음 모델을 사용합니다.
struct Dog { std::string name; int64_t age; }; REALM_SCHEMA(Dog, name, age)
내장된 객체 속성 업데이트
내장된 객체의 속성을 업데이트하려면 쓰기 트랜잭션(write transaction)에서 속성을 수정합니다.
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";
모델
이 예제에서는 다음 모델을 사용합니다.
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
내장된 객체 속성 덮어쓰기
내장된 객체를 덮어쓰려면 쓰기 트랜잭션(write transaction)에서 내장된 객체 속성을 새 인스턴스의 원시 포인터에 다시 할당합니다.
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; });
모델
이 예제에서는 다음 모델을 사용합니다.
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";
역관계 업데이트
역관계 속성은 직접 업데이트할 수 없습니다. 대신 관련된 관련 객체를 통해 할당을 변경하여 역관계가 자동으로 업데이트됩니다.
이 예제에서 Person
객체는 Dog
객체와 대일 관계가 있고, Dog
는 Person
와 역관계가 있습니다. Person
객체가 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);
모델
이 예제에서는 다음 모델을 사용합니다.
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)
지도 속성 업데이트
표준 C++ 맵과 마찬가지로 영역 맵 속성 을업데이트 할 수 있습니다:
// 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; }); ;
모델
이 예제에서는 다음 모델을 사용합니다.
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
세트 속성 업데이트
쓰기 트랜잭션( 쓰기 트랜잭션 (write transaction) )에서 설정하다 속성 을 업데이트 할 수 있습니다. .insert()
요소를 설정하다 로 , 세트에서 erase()
요소를 사용하거나 std::set
알고리즘을 사용하여 설정하다 를 변경할 수 있습니다.
// 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); });
모델
이 예제에서는 다음 모델을 사용합니다.
namespace realm { struct Repository { std::string ownerAndName; std::set<int64_t> openPullRequestNumbers; }; REALM_SCHEMA(Repository, ownerAndName, openPullRequestNumbers) } // namespace realm