Esta guía de inicio rápido muestra cómo usar Realm con el SDK de C++ de Realm. Antes de comenzar, asegúrese de tener instalado el SDK de C++.
Import Realm
Haga que el SDK de C++ de Realm esté disponible en su código incluyendo el
cpprealm/sdk.hpp encabezado en la unidad de traducción donde desea utilizarlo:
Define tu modelo de objeto
Para un dominio exclusivamente local, puede definir su modelo de objetos directamente en el código. En esta guía rápida, puede eliminar ownerId a menos que desee agregar la sincronización de dispositivos opcional.
namespace realm { struct Todo { realm::primary_key<realm::object_id> _id{realm::object_id::generate()}; std::string name; std::string status; // The ownerId property stores the user.identifier() of a // logged-in user. Omit this property for the non-sync example. std::string ownerId; }; REALM_SCHEMA(Todo, _id, name, status, ownerId); } // namespace realm
Abrir un reino
Cuando abres un reino, debes especificar un db_config. Opcionalmente, puede abrir un dominio en una ruta específica o proporcionar un sync_config para abrir un dominio sincronizado.
auto config = realm::db_config(); auto realm = realm::db(std::move(config));
For more information, see: Configure and Open a Realm.
Crear, leer, actualizar y eliminar objetos
Once you have opened a realm, you can modify it and its objects in a write transaction block.
Para instanciar un nuevo objeto Todo y agregarlo al realm en un bloque de escritura:
auto todo = realm::Todo{.name = "Create my first todo item", .status = "In Progress"}; realm.write([&] { realm.add(std::move(todo)); });
Puede recuperar una colección de resultados en vivo de todas las tareas pendientes en el ámbito:
auto todos = realm.objects<realm::Todo>();
You can also filter that collection using where:
auto todosInProgress = todos.where( [](auto const& todo) { return todo.status == "In Progress"; });
To modify a todo, update its properties in a write transaction block:
auto todoToUpdate = todosInProgress[0]; realm.write([&] { todoToUpdate.status = "Complete"; });
Por último, puedes borrar un todo:
realm.write([&] { realm.remove(specificTodo); });
Esté atento a los cambios
Puede observar un objeto para cambios con el método observe.
auto token = specificTodo.observe([&](auto&& change) { try { if (change.error) { rethrow_exception(change.error); } if (change.is_deleted) { std::cout << "The object was deleted.\n"; } else { for (auto& propertyChange : change.property_changes) { std::cout << "The object's " << propertyChange.name << " property has changed.\n"; } } } catch (std::exception const& e) { std::cerr << "Error: " << e.what() << "\n"; } });
Close a Realm
Para cerrar un dominio y liberar todos los recursos subyacentes, llame a db::close(). Cerrar la base de datos invalida los objetos restantes.
realm.close();
Agregar sincronización de dispositivos (opcional)
Si desea sincronizar datos de Realm entre dispositivos, puede configurar una aplicación de Atlas App Services y habilitar Device Sync. Para obtener más información sobre lo que puede hacer con aplicación Services, consulte: aplicación Services - C++ SDK.
Requisitos previos
Before you can sync Realm data, you must:
Habilite la sincronización flexible con el modo de desarrollo activado
Onen. Este ejemplo requiere unownerIdcampo en la sincronización de dispositivos. Queryable Fields sección.
Inicializar la aplicación
To use App Services features such as authentication and sync, access your App Services App using your App ID. You can find your App ID in the App Services UI.
auto appConfig = realm::App::configuration(); appConfig.app_id = APP_ID; auto app = realm::App(appConfig);
Authenticate a User
En esta guía de inicio rápido, usará la autenticación anónima para iniciar sesión sin que los usuarios proporcionen información de identificación. Tras autenticar al usuario, podrá abrir un dominio para él.
auto user = app.login(realm::App::credentials::anonymous()).get();
El SDK de Realm para C++ ofrece muchas maneras adicionales de autenticar, registrar y vincular usuarios. Para conocer otros proveedores de autenticación, consulte: Autenticar usuarios - SDK de C++.
Abrir un reino
Una vez que haya habilitado la Sincronización de dispositivos y autenticado a un usuario, puede crear un objeto sync_configuration y abrir el dominio. A continuación, puede agregar una suscripción de Sincronización flexible que determine qué datos puede leer y escribir el dominio.
auto syncConfig = user.flexible_sync_configuration(); auto realm = realm::db(syncConfig); // For this example, get the userId for the Flexible Sync query auto userId = user.identifier(); auto subscriptions = realm.subscriptions(); auto updateSubscriptionSuccess = subscriptions .update([&](realm::mutable_sync_subscription_set& subs) { subs.add<realm::Todo>("todos", [&userId](auto& obj) { // For this example, get only Todo items where the ownerId // property value is equal to the userId of the logged-in user. return obj.ownerId == userId; }); }) .get();
Leer, escribir y reaccionar a los cambios
The syntax to read, write, and watch for changes on a synced realm is identical to the syntax for non-synced realms above.
La única diferencia es que este ejemplo almacena el user.identifier() del usuario conectado en la propiedad ownerId del elemento Todo. Esto nos permite consultar solo las tareas pendientes del usuario en la suscripción y establecer los permisos de sincronización en Users can only read and write their own data.
Para obtener más información sobre los permisos de sincronización, consulte Permisos basados en roles.
auto todo = realm::Todo{.name = "Create a Sync todo item", .status = "In Progress", .ownerId = userId}; realm.write([&] { realm.add(std::move(todo)); }); auto todos = realm.objects<realm::Todo>();
While you work with local data, a background thread efficiently integrates, uploads, and downloads changesets.
Every write transaction for a subscription set has a performance cost. If you need to make multiple updates to a Realm object during a session, consider keeping edited objects in memory until all changes are complete. This improves sync performance by only writing the complete and updated object to your realm instead of every change.