Realm 구성 및 열기 - C++ SDK
이 페이지의 내용
영역 은 Realm에서 데이터를 구성하는 데 사용되는 핵심 데이터 구조입니다. 영역은 애플리케이션에서 사용하는 Realm 객체라는 객체와 객체를 설명하는 추가 메타데이터의 모음입니다.
Realm 을 열 때 영역 를 지정해야 합니다. db_config
에는 다음과 같은 정보가 포함될 수 있습니다.
기기에서 영역이 저장되는 선택적 경로
영역이 managed 모델의 선택적 목록
이벤트 루프를 사용자 지정해야 하는 경우 선택적 스케줄러
Realm Mobile Sync로 realm을 사용하려는 경우
sync_config
Realm 파일 경로, Realm Mobile Sync 구성 또는 기타 구성 세부 정보를 지정할 필요가 없는 경우 기본 db_config
생성자를 사용할 수 있습니다.
Realm 파일
Realm 은 영역 에 있는 모든 객체 및 유형의 바이너리 인코딩 버전을 단일 .realm
파일 에 저장합니다. 파일 은 영역 을 열 때 정의할 수 있는 특정 경로 에 있습니다. 을(를) 사용하여 이러한 파일의 내용을 열고, 보고, 편집할 수 있습니다 .
보조 파일
SDK는 각 영역에 대해 추가 파일을 생성합니다.
'realm' 접미사가 붙은 영역 파일(예:
default.realm
: 객체 데이터를 포함합니다.잠금 파일, "lock" 접미사(예:
default.realm.lock
: Realm에서 활발하게 사용 중인 데이터 버전을 추적합니다. 이렇게 하면 Realm이 클라이언트 애플리케이션에서 아직 사용 중인 저장 공간을 회수할 수 없습니다.메모 파일, 접미사 '메모'(예:
default.realm.note
: 스레드 간 및 프로세스 간 알림을 활성화합니다.관리 파일, 접미사 "관리"(예:
default.realm.management
: 내부 상태 관리입니다.
동기화된 Realms
각각 로컬 데이터 복사본을 가진 여러 기기 간에 데이터를 자동으로 동기화하도록 영역을 구성할 수 있습니다. 동기화된 영역에는 sync_config
이(가) 필요하며 동기화 프로세스를 처리하기 위해 Atlas App Services 백엔드가 필요합니다.
애플리케이션은 오프라인 상태에서도 항상 로컬에서 동기화된 Realm 객체를 생성, 수정 및 삭제할 수 있습니다. 네트워크 연결이 가능할 때마다 Realm SDK는 애플리케이션 서버에 대한 연결을 열고 다른 클라이언트와 변경 사항을 동기화합니다. Atlas Device Sync 프로토콜 과 서버 측 운영 변환은 일부 변경 사항이 오프라인에서 발생했거나 순서가 잘못되었더라도 Realm의 완전히 동기화된 모든 인스턴스가 정확히 동일한 데이터를 볼 수 있도록 보장합니다.
동기화 Realms과 비동기화 Realms 비교
동기화된 영역은 동기화되지 않은 로컬 영역과 다음과 같은 몇 가지가 다릅니다.
동기화된 영역은 백엔드 App Services App과 변경 사항을 동기화하려고 시도하지만, 비동기화 영역은 동기화를 시도하지 않습니다.
동기화된 영역은 인증된 사용자만 액세스할 수 있지만 동기화되지 않은 영역에는 사용자 또는 인증 개념이 없습니다.
동기화된 영역을 사용하면 영역을 열기 전에 업데이트를 다운로드할 수 있습니다. 그러나 Realm을 열기 전에 변경 사항을 다운로드하도록 요구하려면 사용자가 온라인 상태여야 합니다. 동기화되지 않은 Realm은 항상 오프라인에서 사용할 수 있습니다.
동기화되지 않은 영역에서 동기화된 영역으로 또는 그 반대로 데이터를 복사할 수 있지만 동기화되지 않은 영역은 동기화할 수 없습니다.
비동기화 Realm 열기
기본 생성자를 사용하여 현재 디렉토리에서 영역을 열 수 있습니다. 또는 특정 파일 경로로 db_config
를 구성하여 특정 위치에서 영역을 열 수 있습니다.
기본 Realm 열기
선택적 경로를 지정하지 않고 영역을 열면 현재 디렉토리에서 기본 영역이 열립니다.
영역을 열 때 C++ SDK는 프로젝트에서 어떤 모델을 사용할 수 있는지 자동으로 추론할 수 있습니다. 비대칭 객체와 데이터를 단방향으로 동기화하기 위해 영역을 여는 경우가 아니라면 사용 가능한 모델을 수동으로 지정할 필요가 없습니다. 자세한 내용은 이 페이지의 동기화된 Realm 열기를 참조하세요.
auto config = realm::db_config(); auto realm = realm::db(std::move(config));
팁
Android 앱 빌드
Realm C++ SDK를 사용하는 Android 앱을 빌드할 때는 db_config 생성자의 path
매개변수에 filesDir.path
를 전달해야 합니다. 자세한 내용 은 Android 앱 빌드를 참조하세요.
파일 경로에서 Realm 열기
set_path()
을 사용하여 영역을 열 때 사용할 db_config
의 경로를 지정할 수 있습니다.
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));
팁
Android 앱 빌드
Realm C++ SDK를 사용하는 Android 앱을 빌드할 때는 db_config 생성자에서 path
매개변수로 filesDir.path
를 전달해야 합니다. 자세한 내용 은 Android 앱 빌드를 참조하세요.
동기화된 Realm 열기
기기 간에 데이터를 동기화하려면 Flexible Sync를 구성한 Atlas App Services 앱 이 있어야 합니다.
동기화된 영역을 열려면 다음을 수행합니다.
Atlas App Services App에 연결합니다.
사용자를 인증합니다.
동기화 구성을 만듭니다.
구성과 동기화된 사용자의 영역을 엽니다.
// 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);
동기화된 영역을 열 때, 영역에서 managed 모델을 열기 함수의 템플릿 매개 변수 목록에 전달할 필요가 없습니다. 이는 더 이상 사용되지 않는 알파 API의 변경 사항입니다.
이 규칙의 유일한 예외는 동기화된 영역을 열어 asymmetric_object
유형을 동기화하는 것입니다. asymmetric_object
유형을 동기화하기 위해 동기화된 영역을 여는 경우 열기 함수에 대한 템플릿 매개변수 목록에서 객체를 명시적으로 지정해야 합니다. 자세한 내용 은 Atlas로 데이터 스트리밍 - C++ SDK를 참조하세요.
팁
Android 앱 빌드
Realm C++ SDK를 사용하는 Android 앱을 빌드할 때는 db_config 생성자의 path
매개변수에 filesDir.path
를 전달해야 합니다. 자세한 내용 은 Android 앱 빌드를 참조하세요.
동기화된 Realm 사용 시 사용자 지정 HTTP headers 설정
Realm Mobile Sync에서 사용자 지정 HTTP headers를 사용하려면 앱 과 flexible_sync_configuration()
에서 헤더를 설정해야 합니다.
구성을 초기화한 후 set_custom_http_headers()
멤버 함수를 사용하여 사용자 지정 HTTP headers를 문자열 헤더 키와 값의 맵으로 설정합니다.
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);
이제 Realm Mobile Sync 네트워크 요청에 헤더를 사용할 수 있는 동기화된 영역입니다.
Realm에 모델의 하위 집합 제공
팁
메모리 제약이 적은 상태에서 작동
일부 애플리케이션은 메모리 설치 공간에 엄격한 제약이 있습니다. 메모리가 부족한 환경에 맞게 영역 메모리 사용량을 최적화하려면 모델의 하위 집합으로 영역을 엽니다.
기본적으로 C++ SDK는 실행 파일에 객체 스키마 가 있는 모든 Realm 객체 유형을 데이터베이스 스키마에 자동으로 추가합니다.
하지만 영역에서 모델의 하위 집합만 managed 하려면 해당 모델을 realm::open()
함수의 템플릿 매개 변수 목록에 전달하여 지정할 수 있습니다.
auto config = realm::db_config(); auto realm = realm::open<realm::Dog>(std::move(config));
Realm 닫기
메모리 누수를 방지하려면 사용을 마친 데이터베이스를 닫습니다. 데이터베이스를 닫으면 나머지 객체가 모두 무효화됩니다. 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());