Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

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 객체와 대일 관계가 있고, DogPerson 와 역관계가 있습니다. 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

돌아가기

읽기