Configure & Open a Realm - C++ SDK
On this page
A realm is the core data structure used to organize data in Realm. A realm is a collection of the objects that you use in your application, called Realm objects, as well as additional metadata that describe the objects.
When opening a realm, you must specify a db_config.
The db_config
may contain information such as:
An optional path where the realm is stored on device
An optional list of models that the realm should manage
An optional scheduler if you need to customize the run loop
A
sync_config
if you want to use the realm with Device Sync
You can use the default db_config
constructor if you do not need
to specify a realm file path, a Device Sync configuration, or other
configuration details.
Realm Files
Realm stores a binary encoded version of every object and type in a
realm in a single .realm
file. The file is located at a specific
path that you can define when you open the realm.
You can open, view, and edit the contents of these files with
.
Auxiliary Files
The SDK creates additional files for each realm:
realm files, suffixed with "realm", e.g.
default.realm
: contain object data.lock files, suffixed with "lock", e.g.
default.realm.lock
: keep track of which versions of data in a realm are actively in use. This prevents realm from reclaiming storage space that is still used by a client application.note files, suffixed with "note", e.g.
default.realm.note
: enable inter-thread and inter-process notifications.management files, suffixed with "management", e.g.
default.realm.management
: internal state management.
Synced Realms
You can configure a realm to automatically synchronize data between many
devices that each have their own local copy of the data. Synced realms
need a sync_config
and require an Atlas App Services backend to handle
the synchronization process.
Applications can always create, modify, and delete synced realm objects locally, even when offline. Whenever a network connection is available, the Realm SDK opens a connection to an application server and syncs changes to and from other clients. The Atlas Device Sync protocol and server-side operational transforms guarantee that all fully synced instances of a realm see exactly the same data, even if some changes occurred offline and/or were received out of order.
Synced Realms vs. Non-Synced Realms
Synced realms differ from non-synced local Realm in a few ways:
Synced realms attempt to sync changes with your backend App Services App, whereas non-synced realms do not.
Synced realms can only be accessed by authenticated users, while non-synced realms have no concept of users or authentication.
With synced realms, you can download updates before opening a realm. However, requiring changes to download before opening the realm requires the user to be online. Non-synced realms can always be used offline.
You can manually copy data from a non-synced realm to a synced realm, and vice versa, but you cannot sync a non-synced realm.
Open a Non-Sync Realm
You can open a realm in the current directory using the default constructor.
Or you can construct a db_config
with a specific file path to open the realm
in a specific location.
Open the Default Realm
Opening a realm without specifying an optional path opens the default realm in the current directory.
When opening a realm, the C++ SDK can automatically infer which models are available in the project. You don't need to manually specify the available models unless you are opening a realm to sync data unidirectionally with asymmetric objects. For more information, refer to Open a Synced Realm on this page.
auto config = realm::db_config(); auto realm = realm::db(std::move(config));
Tip
Building an Android App
When building an Android app that uses the Realm C++ SDK,
you must pass the filesDir.path
to the path
parameter in the
db_config
constructor. For more information, refer to: Build an Android App.
Open a Realm at a File Path
You can use set_path()
to specify a path for the db_config
to use when opening the realm.
auto relative_realm_path_directory = "custom_path_directory/"; std::filesystem::create_directories(relative_realm_path_directory); // Construct a path std::filesystem::path path = std::filesystem::current_path().append(relative_realm_path_directory); // Add a name for the database file path = path.append("employee_objects"); // Add the .realm extension path = path.replace_extension("realm"); // Set the path on the config, and open the database at the path auto config = realm::db_config(); config.set_path(path); auto realmInstance = realm::db(std::move(config));
Tip
Building an Android App
When building an Android app that uses the Realm C++ SDK,
you must pass the filesDir.path
as the path
parameter in the
db_config
constructor. For more information, refer to: Build an Android App.
Open a Synced Realm
You must have an Atlas App Services App that you have configured for Flexible Sync in order to sync data between devices.
To open a synced realm:
Connect to an Atlas App Services App.
Authenticate the user.
Create a sync configuration.
Open the user's synced realm with the configuration.
// Initialize the App, authenticate a user, and open the database auto appConfig = realm::App::configuration(); appConfig.app_id = APP_ID; auto app = realm::App(appConfig); auto user = app.login(realm::App::credentials::anonymous()).get(); auto syncConfig = user.flexible_sync_configuration(); auto syncedRealm = realm::db(syncConfig);
When you open a synced realm, you don't need to pass the models you want the realm to manage into the template parameter list of the open function. This is a change from the deprecated Alpha API.
The only exception to this rule is opening a synced realm to sync
asymmetric_object
types. When you open a synced realm to sync
asymmetric_object
types, you must explicitly specify the objects
in the template parameter list for the open function. For more
information, refer to Stream Data to Atlas - C++ SDK.
Tip
Building an Android App
When building an Android app that uses the Realm C++ SDK,
you must pass the filesDir.path
to the path
parameter in the
db_config
constructor. For more information, refer to: Build an Android App.
Set Custom HTTP Headers When Using a Synced Realm
To use custom HTTP headers with Device Sync, you must set the headers
on the App and on the
flexible_sync_configuration()
.
After you initialize the configuration, use the set_custom_http_headers()
member function to set the custom HTTP headers to a map of
string header keys and values.
std::map<std::string, std::string> customHeaders; customHeaders.emplace("CUSTOM_HEADER_NAME", "CUSTOM_HEADER_VALUE"); auto syncConfig = user.flexible_sync_configuration(); syncConfig.set_custom_http_headers(customHeaders);
Now the synced realm can use the headers for all Device Sync network requests.
Provide a Subset of Models to a Realm
Tip
Operating with Low Memory Constraints
Some applications have tight constraints on their memory footprints. To optimize your realm memory usage for low-memory environments, open the realm with a subset of models.
By default, the C++ SDK automatically adds all object types that have a Object Schema in your executable to your Database Schema.
However, if you want the realm to manage only a subset of models, you
can specify those models by passing them into the template parameter list
of the realm::open()
function.
auto config = realm::db_config(); auto realm = realm::open<realm::Dog>(std::move(config));
Close a Realm
To avoid memory leaks, close the database when you're done using it. Closing
the database invalidates any remaining objects. Close the database with
db::close()
.
// Create a database configuration. auto config = realm::db_config(); auto realm = realm::db(config); // Use the database... // ... later, close it. realm.close(); // You can confirm that the database is closed if needed. CHECK(realm.is_closed()); // Objects from the database become invalidated when you close the database. CHECK(specificDog.is_invalidated());