对象模型 - C++ SDK
Atlas Device SDK 应用程序将数据建模为由字段值对组成的对象,每个字段值对包含一种或多种受支持的数据类型。
对象类型和模式
每个数据库对象都有一个引用该对象类的对象类型。 同一类型的对象股票一个对象模式,该模式定义了这些对象的属性和关系。
数据库模式
数据库模式是数据库可能包含的有效对象模式的列表。 每个数据库对象都必须符合其数据库模式中包含的Realm 对象类型。
打开数据库时,必须将模型传递给用于打开数据库的模板,以指定可用的模型。 这些模型必须具有模式,并且此模式列表将成为数据库模式。
如果在打开数据库时数据库已包含数据,则 SDK 会验证每个对象,以确保为其类型提供了对象模式,并且满足模式中指定的所有约束。
有关如何打开数据库的更多信息,请参阅配置和打开 Realm - C++ SDK
对象模型
您的 Realm 对象模型是核心结构,它为数据库提供有关如何解释和存储应用程序中的对象的信息。C++ SDK 对象模型是常规 C++ 类或包含属性集合的结构体。 要保留的属性必须使用受支持的数据类型。 属性也是在Realm 对象类型之间建立关系的机制。
定义 C++ 类或结构时,还必须提供对象模式。 该模式是一个 C++ 宏,为 SDK 提供有关要保留哪些属性以及数据库对象类型的信息。
您必须在 realm
命名空间内定义 SDK 对象模型。
对象模式
C# SDK 对象模式映射 Realm 对象类型的属性。SDK 模式是一些宏,可为 SDK 提供存储和检索对象所需的信息。 要保留的每个对象模型都必须有一个模式,它可以是以下类型之一:
REALM_SCHEMA
REALM_EMBEDDED_SCHEMA
REALM_ASYMMETRIC_SCHEMA
您必须在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 App 的数据库。
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)