Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/ /

对象模型 - 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)

后退

模型数据