Las aplicaciones Atlas Device SDK modelan los datos como objetos compuestos por pares de campo-valor que contienen cada uno uno o más tipos de datos compatibles.
Tipos de objetos y esquemas
Cada objeto de base de datos tiene un tipo de objeto que hace referencia a la clase del objeto. Los objetos del mismo tipo comparten un esquema de objeto que define las propiedades y relaciones de esos objetos.
Esquema de base de datos
Un esquema de base de datos es una lista de esquemas de objetos válidos que la base de datos puede contener. Cada objeto de la base de datos debe cumplir con un tipo de objeto incluido en su esquema.
Al abrir una base de datos, debe especificar los modelos disponibles pasándolos a la plantilla que utiliza para abrirla. Estos modelos deben tener esquemas, y esta lista de esquemas se convierte en el esquema de la base de datos.
Si la base de datos ya contiene datos cuando la abre, el SDK valida cada objeto para garantizar que se haya proporcionado un esquema de objeto para su tipo y que cumpla con todas las restricciones especificadas en el esquema.
Para obtener más información sobre cómo abrir la base de datos, consulte Configurar y abrir un dominio - C++ SDK
Modelo de objetos
El modelo de objetos es la estructura principal que proporciona a la base de datos información sobre cómo interpretar y almacenar los objetos en la aplicación. El modelo de objetos del SDK de C++ es una clase o estructura de C++ normal que contiene un conjunto de propiedades. Las propiedades que se desean conservar deben usar tipos de datos compatibles. Las propiedades también son el mecanismo para establecer relaciones entre los tipos de objetos.
Al definir su clase o estructura de C++, también debe proporcionar un esquema de objeto. El esquema es una macro de C++ que proporciona al SDK información sobre qué propiedades conservar y qué tipo de objeto de base de datos es.
Debe definir su modelo de objeto SDK dentro del realm espacio de nombres.
Esquema de objeto
Un esquema de objeto de un SDK de C++ asigna propiedades para un tipo de objeto específico. Los esquemas del SDK son macros que proporcionan al SDK la información necesaria para almacenar y recuperar los objetos. Cada modelo de objeto que se desee conservar debe ir acompañado de un esquema, que puede ser uno de los siguientes:
REALM_SCHEMAREALM_EMBEDDED_SCHEMAREALM_ASYMMETRIC_SCHEMA
Debe definir el esquema y su modelo de objeto dentro del espacio de nombres realm.
Definir un nuevo tipo de objeto
En el SDK de C++, puede definir sus modelos como estructuras o clases de C++. Proporcione un esquema de objeto con el nombre del tipo de objeto y los nombres de las propiedades que desea conservar en la base de datos. Al agregar el objeto a la base de datos, el SDK ignora las propiedades que omita del esquema.
Debe declarar su objeto y el esquema dentro del espacio de nombres realm. Luego, debe usar el espacio de nombres realm al inicializar y realizar operaciones CRUD con el objeto.
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
Nota
Los nombres de clase están limitados a un máximo de 57 caracteres UTF-8.
Especificar una clave principal
Puede designar una propiedad como la clave principal de su objeto.
Las claves principales le permiten buscar, actualizar e insertar objetos de manera eficiente.
Las claves primarias están sujetas a las siguientes limitaciones:
Puede definir solo una clave principal por modelo de objeto.
Los valores de clave principal deben ser únicos en todas las instancias de un objeto en la base de datos. El SDK de C++ genera un error si se intenta insertar un valor de clave principal duplicado.
Los valores de la llave primaria son inmutables. Para cambiar el valor de la clave primaria de un objeto, se debe borrar el objeto original e insertar uno nuevo con un valor de clave primaria diferente.
Los objetos incrustados no pueden definir una clave principal.
Si está utilizando Device Sync, sus modelos deben tener una clave principal _id denominada.
El SDK de C++ admite claves principales de los siguientes tipos y sus variantes opcionales:
int64_trealm::object_idrealm::uuidstd::string
Además, una propiedad realm::enum requerida puede ser una clave principal, pero realm::enum no puede ser opcional si se utiliza como clave principal.
Establezca una propiedad como clave principal con la plantilla 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)
Ignorar una propiedad
Su modelo puede incluir propiedades que la base de datos no almacena.
La base de datos ignora cualquier propiedad que no esté incluida en el esquema del objeto.
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
Definir un objeto incrustado
Un objeto incrustado es un tipo especial de objeto que modela datos complejos sobre un objeto concreto. Los objetos incrustados son similares a las relaciones, pero ofrecen restricciones adicionales y reflejan de manera más natural el modelo de documento denormalizado de MongoDB.
El SDK de C++ aplica restricciones de propiedad únicas que tratan cada objeto incrustado como datos anidados dentro de un único objeto principal específico. Un objeto incrustado hereda el ciclo de vida de su objeto principal y no puede existir como un objeto de base de datos independiente. El SDK elimina automáticamente los objetos incrustados si se elimina su objeto principal o si se sobrescriben con una nueva instancia de objeto incrustado.
Puedes declarar un objeto como un objeto incrustado que no tenga un ciclo de vida independiente del objeto en el que está incrustado. Esto difiere de una relación de uno a uno o de uno a muchos, en la que los objetos relacionados tienen ciclos de vida independientes.
Proporcione un REALM_EMBEDDED_SCHEMA con el nombre de la estructura o clase y los nombres de las propiedades que desea que la base de datos persista.
Defina una propiedad como un objeto incrustado en el objeto padre estableciendo un puntero al tipo del objeto incrustado.
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
Definir un objeto asimétrico
Puede utilizar la ingesta de datos para sincronizar un objeto de forma unidireccional desde su dispositivo a la base de datos vinculada a su aplicación Atlas App Services.
Un asymmetric_object tiene en general los mismos tipos admitidos realm::objectque, con algunas excepciones:
Los objetos asimétricos pueden vincularse a los siguientes tipos: -
object-embedded_object-std::vector<embedded_object>
Los objetos asimétricos no funcionan igual que otros objetos de base de datos. No se puede:
Eliminar un objeto asimétrico de la base de datos del dispositivo
Consultar un objeto asimétrico de la base de datos del dispositivo
Solo puedes crear un objeto asimétrico, que luego se sincroniza unidireccionalmente con la base de datos Atlas vinculada a tu aplicación con Device Sync.
Para obtener más información, consulte: Crear un objeto asimétrico.
En el SDK de C++, defina un objeto asimétrico de la misma forma que definiría una estructura o clase de C++ normal. Indique un REALM_ASYMMETRIC_SCHEMA con el nombre de la estructura o clase y los nombres de las propiedades que desea que la base de datos conserve.
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)