Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

객체 모델 - C++ SDK

이 페이지의 내용

  • 객체 유형 및 스키마
  • 데이터베이스 스키마
  • 객체 모델
  • 객체 스키마
  • 새 객체 유형 정의
  • 프라이머리 키 설정
  • 속성 무시
  • 포함된 객체 정의
  • 비대칭 객체 정의

Atlas Device SDK 애플리케이션은 데이터를 각각 지원되는 데이터 유형을 하나 이상 포함하는 필드-값 쌍으로 구성된 객체로 모델링합니다.

모든 데이터베이스 객체 에는 객체의 클래스를 참조하는 객체 유형 이 있습니다. 동일한 유형의 객체는 해당 객체의 속성과 관계를 정의하는 객체 스키마 를 주식 합니다.

데이터베이스 스키마 는 데이터베이스에 포함될 수 있는 유효한 객체 스키마 목록입니다. 모든 데이터베이스 객체는 해당 데이터베이스의 스키마에 포함된 객체 유형을 준수해야 합니다.

데이터베이스를 열 때 데이터베이스를 여는 데 사용하는 템플릿에 모델을 전달하여 사용 가능한 모델을 지정해야 합니다. 이러한 모델에는 스키마가 있어야 하며, 이 스키마 목록이 데이터베이스 스키마가 됩니다.

데이터베이스를 열 때 데이터베이스에 이미 데이터가 포함되어 있는 경우, SDK는 각 객체의 유효성을 검사하여 해당 유형에 대한 객체 스키마가 제공되었는지, 그리고 스키마에 지정된 모든 제약 조건을 충족하는지 확인합니다.

데이터베이스를 여는 방법에 대한 자세한 내용은 Realm 구성 및 열기 - C++ SDK를 참조하세요.

객체 모델은 앱에서 객체를 해석하고 저장하는 방법에 대한 정보를 데이터베이스에 제공하는 핵심 구조입니다. C++ SDK 객체 모델은 일반 C++ 클래스 또는 속성 컬렉션을 포함하는 구조체입니다. 유지하려는 속성은 지원되는 데이터 유형 을 사용해야 합니다. 속성은 객체 유형 간의 관계 를 설정하는 메커니즘이기도 합니다.

C++ 클래스 또는 구조체를 정의할 때는 객체 스키마도 제공해야 합니다. 스키마는 유지할 속성 및 데이터베이스 객체 유형에 대한 정보를 SDK에 제공하는 C++ 매크로입니다.

realm 네임스페이스 내에서 SDK 객체 모델을 정의해야 합니다.

C++ SDK 객체 스키마 는 특정 Realm 객체 유형에 대한 속성을 매핑합니다. SDK 스키마는 객체를 저장하고 검색하는 데 필요한 정보를 SDK에 제공하는 매크로입니다. 스키마는 유지하려는 모든 객체 모델과 함께 제공되어야 하며 다음 중 하나일 수 있습니다.

  • REALM_SCHEMA

  • REALM_EMBEDDED_SCHEMA

  • REALM_ASYMMETRIC_SCHEMA

realm 네임스페이스 내에서 스키마와 Realm 객체 모델을 정의해야 합니다.

C++ SDK에서는 모델을 일반 C++ 구조체 또는 클래스로 정의할 수 있습니다. 객체 스키마 에 객체 유형 이름과 데이터베이스에 유지하려는 속성의 이름을 제공합니다. 데이터베이스에 객체를 추가할 때 SDK는 스키마에서 생략한 모든 속성을 무시합니다.

객체와 스키마는 realm 네임스페이스 내에서 선언해야 합니다. 그런 다음 객체를 초기화하고 해당 객체로 CRUD 작업을 수행할 때 realm 네임스페이스를 사용해야 합니다.

namespace realm {
struct Dog {
std::string name;
int64_t age;
};
REALM_SCHEMA(Dog, name, age)
struct Person {
realm::primary_key<int64_t> _id;
std::string name;
int64_t age;
// Create relationships by pointing an Object field to another struct or class
Dog *dog;
};
REALM_SCHEMA(Person, _id, name, age, dog)
} // namespace realm

참고

클래스 이름은 최대 57자의 UTF-8 문자로 제한됩니다.

속성을 객체의 기본 키로 지정할 수 있습니다.

기본 키를 사용하면 객체를 효율적으로 찾고, 업데이트하고, 업서트할 수 있습니다.

프라이머리 키에는 다음과 같은 제한 사항이 적용됩니다.

  • 객체 모델당 프라이머리 키는 하나만 정의할 수 있습니다.

  • 기본 키 값은 데이터베이스에 있는 객체의 모든 인스턴스에서 고유해야 합니다. 중복된 기본 키 값을 삽입하려고 하면 C++ SDK에서 오류가 발생합니다.

  • 프라이머리 키 값은 변경되지 않습니다. 객체의 프라이머리 키 값을 변경하려면 원본 객체를 삭제하고 프라이머리 키 값이 다른 새 객체를 삽입해야 합니다.

  • 내장된 객체는 기본 키를 정의할 수 없습니다.

Device Sync 를 사용하는 경우 모델에 _id 라는 프라이머리 키가 있어야 합니다.

C++ SDK는 다음 유형의 기본 키와 해당 선택적 변형을 지원합니다.

  • int64_t

  • realm::object_id

  • realm::uuid

  • std::string

또한 필수 realm::enum 속성은 기본 키가 될 수 있지만 realm::enum 이 기본 키로 사용되는 경우 선택 사항일 수 없습니다.

primary_key 템플릿을 사용하여 속성을 기본 키로 설정합니다.

struct Person {
realm::primary_key<int64_t> _id;
std::string name;
int64_t age;
// Create relationships by pointing an Object field to another struct or class
Dog *dog;
};
REALM_SCHEMA(Person, _id, name, age, dog)

모델에 데이터베이스에 저장되지 않는 속성이 포함될 수 있습니다.

데이터베이스는 객체 스키마에 포함되지 않은 모든 속성을 무시합니다.

namespace realm {
struct Employee {
realm::primary_key<int64_t> _id;
std::string firstName;
std::string lastName;
// You can use this property as you would any other member
// Omitting it from the schema means the SDK ignores it
std::string jobTitle_notPersisted;
};
// The REALM_SCHEMA omits the `jobTitle_notPersisted` property
// The SDK does not store and cannot retrieve a value for this property
REALM_SCHEMA(Employee, _id, firstName, lastName)
} // namespace realm

포함된 객체 는 특정 객체에 대한 복잡한 데이터를 모델링하는 특수 유형의 객체입니다. 포함된 객체는 관계와 유사하지만 추가 제약 조건을 제공하고 비정규화된 MongoDB document model 에 더 자연스럽게 매핑됩니다.

C++ SDK는 내장된 객체를 단일 특정 상위 객체 내부의 중첩 데이터로 처리한다는 고유한 소유권 제약 조건을 적용합니다. 내장된 객체는 상위 객체의 라이프사이클을 상속하며 독립적인 데이터베이스 객체로 존재할 수 없습니다. SDK는 상위 객체가 삭제되거나 새 내장된 객체 인스턴스로 덮어쓰면 내장된 객체를 자동으로 삭제합니다.

객체를 포함된 객체 와 독립적인 수명 주기가 없는 내장된 객체 객체 를 선언할 수 있습니다. 이는 관련 객체가 독립적인 수명 주기를 갖는 대일 또는 대다 관계 와는 다릅니다.

구조체 또는 클래스 이름과 데이터베이스에서 유지하려는 속성의 이름이 포함된 REALM_EMBEDDED_SCHEMA 를 제공합니다.

내장된 객체의 유형에 대한 포인터를 설정하여 속성을 상위 객체에 내장된 객체로 정의합니다.

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

데이터 수집 을 사용하여 기기에서 Atlas App Services 앱에 연결된 데이터베이스에 객체를 단방향으로 동기화할 수 있습니다.

asymmetric_object 는 몇 가지 예외를 제외하고 대체로 realm::object 와 동일한 유형을 지원합니다 .

  • 비대칭 객체는 다음 유형에 연결할 수 있습니다: - object - embedded_object - std::vector<embedded_object>

비대칭 객체는 다른 데이터베이스 객체와 동일한 방식으로 작동하지 않습니다. 다음을 수행할 수 없습니다.

  • 장치 데이터베이스에서 비대칭 객체 제거

  • 기기 데이터베이스에서 비대칭 객체 쿼리

비대칭 객체만 생성할 수 있으며 이 객체는 Device Sync를 통해 앱에 연결된 Atlas 데이터베이스와 단방향으로 동기화됩니다.

자세한 내용은 비대칭 객체 생성하기를 참조하세요.

C++ SDK에서 일반 C++ 구조체 또는 클래스와 동일한 방식으로 비대칭 객체를 정의합니다. 구조체 또는 클래스 이름과 데이터베이스에서 유지하려는 속성의 이름이 포함된 REALM_ASYMMETRIC_SCHEMA 를 제공합니다.

struct WeatherSensorReading {
realm::primary_key<realm::object_id> _id{realm::object_id::generate()};
std::string deviceId;
double temperatureInFahrenheit;
int64_t windSpeedInMph;
};
REALM_ASYMMETRIC_SCHEMA(WeatherSensorReading, _id, deviceId,
temperatureInFahrenheit, windSpeedInMph)

돌아가기

모델 데이터