Docs Menu
Docs Home
/ /
Atlas Device SDK
/

Realm 파일 작업 - .NET SDK

이 페이지의 내용

  • Realm 라이프사이클
  • 멀티 프로세스
  • Realm 스키마
  • 동기화된 Realms
  • Realm 파일 찾기
  • Realm 파일 크기
  • 최대 활성 버전 수 제한
  • Realm 축소
  • Realm 백업 및 복원
  • 모듈

영역 은 사전 정의된 스키마 를 준수하는 관련 객체 설정하다 입니다. Realm은 각 유형에 대한 스키마 가 존재하는 한 두 가지 이상의 데이터 유형을 포함할 수 있습니다.

모든 영역 은 영역 의 각 객체 에 대한 바이너리 인코딩을 포함하는 별도의 영역 파일 에 데이터를 저장합니다. 여러 기기에서 영역 을 자동으로 동기화하고 영역 의 객체 가 생성, 수정 또는 삭제될 때마다 함수를 호출하는 반응형 이벤트 핸들러 를 설정하다 수 있습니다.

모든 영역 인스턴스 는 상당한 양의 리소스를 소비합니다. 영역 을 열고 닫는 것은 모두 비용이 많이 드는 작업이지만 영역 을 열어 두면 상당한 리소스 오버헤드 가 발생합니다. 애플리케이션 의 성능을 극대화하려면 항상 열려 있는 Realm 수를 최소화하고 사용되는 열기 및 닫기 작업 수를 제한해야 합니다.

그러나 영역 을 여는 데 항상 많은 비용이 드는 것은 아닙니다. 영역 이 동일한 프로세스 또는 스레드 내에서 이미 열려 있는 경우 추가 인스턴스 를 여는 데 필요한 리소스는 더 적습니다.

  • Realm이 동일한 프로세스 내에서 열려 있지 않으면 Realm을 여는 데 비용이 많이 듭니다.

  • Realm이 동일한 프로세스 내의 다른 스레드에서 이미 열려 있는 경우 Realm을 여는 것이 더 저렴하지만 여전히 중요하지 않습니다.

  • Realm이 동일한 프로세스 내의 동일한 스레드에서 이미 열려 있는 경우 Realm을 열려면 최소한의 추가 리소스만 필요합니다.

Realm 영역 데이터를 영역 쓰기 (write) 데 필요한 메모리 매핑 및 스키마 유효성 검사 를 수행합니다. 동일한 스레드에 있는 해당 영역 의 추가 인스턴스는 동일한 기본 리소스를 사용합니다. 별도의 스레드에 있는 해당 영역 의 인스턴스는 동일한 기본 리소스 중 일부를 사용합니다.

스레드에서 Realm 에 대한 모든 연결이 영역 Realm은 해당 영역 에 연결하는 데 사용된 스레드 리소스를 해제합니다. 프로세스 에서 Realm 에 대한 모든 연결이 영역 Realm은 해당 영역 에 연결하는 데 사용된 모든 리소스를 해제합니다.

가장 좋은 방법은 영역 인스턴스 수명 주기를 영역을 관찰하는 뷰의 수명 주기에 연결하는 것입니다. 인스턴스, Fragment 을 통해 RealmResults 데이터를 표시하는 RecyclerView 을 생각해 보겠습니다. 다음을 수행할 수 있습니다.

  • Fragment.onCreateView() 수명 주기 메서드에서 해당 뷰에 대한 데이터가 포함된 단일 영역 을 엽니다.

  • Fragment.onDestroyView() 수명 주기 메서드에서 동일한 영역 을 닫습니다.

참고

영역 이 특히 큰 경우 Fragment.onCreateView() 에서 영역 인스턴스 를 가져오면 렌더링이 잠시 차단 될 수 있습니다. onCreateView() 에서 영역 을 열면 성능 문제가 발생하는 경우 대신 Fragment.onStart()Fragment.onStop() 에서 영역 을 관리하는 것이 좋습니다.

여러 Fragment 인스턴스가 동일한 데이터 세트에 액세스해야 하는 경우 바깥쪽 Activity 에서 단일 영역을 관리할 수 있습니다.

  • Activity.onCreate() 수명 주기 메서드에서 영역 을 엽니다.

  • Activity.onDestroy() 수명 주기 메서드에서 영역을 닫습니다.

다른 프로세스에서 암호화됨 되거나 동기화 된 Realm에 동시에 액세스 할 수 없습니다. 그러나 로컬 Realm은 프로세스 전체에서 정상적으로 작동하므로 여러 APK에서 을 읽고, 쓰기 (write), 알림 을 받을 수 있습니다.

Realm 스키마 는 앱이 유지할 수 있는 객체 유형을 각각 정의하는 유효한 객체 스키마 목록입니다. Realm의 모든 객체는 영역 Realm 스키마 를 준수해야 합니다.

기본적으로 SDK는 RealmObject 에서 파생되는 프로젝트의 모든 클래스를 Realm 스키마에 자동으로 추가합니다.

클라이언트 애플리케이션은 Realm을 열 때 영역 Realm 스키마 를 제공합니다. 영역 에 이미 데이터가 포함되어 있는 경우 Realm 은 각 기존 객체 의 유효성을 검사하여 해당 유형에 대한 객체 스키마 가 제공되었는지, 스키마 에 지정된 모든 제약 조건을 충족하는지 확인합니다.

예시

라이브러리의 책에 대한 기본 데이터가 포함된 영역 은 다음과 같은 스키마 를 사용할 수 있습니다.

[
{
"type": "Library",
"properties": {
"address": "string",
"books": "Book[]"
}
},
{
"type": "Book",
"primaryKey": "isbn",
"properties": {
"isbn": "string",
"title": "string",
"author": "string",
"numberOwned": { "type": "int?", "default": 0 },
"numberLoaned": { "type": "int?", "default": 0 }
}
}
]

Atlas Device Sync 를 사용하는 앱 은 동기화된 영역 을 열 수 있습니다.

Flexible Sync 를 사용하면 쿼리를 구독 하여 클라이언트 애플리케이션이 동기화하는 데이터를 사용자 지정할 수 있습니다. 이러한 쿼리는 Atlas Search에서 앱 백엔드의 데이터를 검색하고 Flexible Sync Realm은 쿼리와 일치하는 데이터를 동기화합니다. 클라이언트 애플리케이션은 사용자에게 데이터에 액세스할 수 있는 적절한 읽기 또는 읽기 및 쓰기 권한 이 있는 경우에만 데이터를 동기화할 수 있습니다.

파티션 기반 동기화 를 사용하는 경우 동기화된 영역은 Atlas 데이터의 파티션을 나타냅니다. 각 Realm은 앱 데이터 소스에 있는 데이터의 하위 집합에 해당합니다. 애플리케이션의 파티션 키 를 사용하여 데이터 분할 을 사용자 지정할 수 있습니다. 파티션 값 으로 알려진 파티션 키의 고유 값은 개별 Realm에 해당합니다.

Realm 규칙을 구성할 때 동기화된 영역이 앱에서 읽고 쓰기 (write) 수 있는 데이터에 대한 권한을 사용자 지정할 수 있습니다.

자세한 내용 은 동기화된 Realm 구성 - Java SDK 를 참조하세요.

Realm 은 영역 에 있는 모든 객체 및 유형의 바이너리 인코딩 버전을 단일 .realm 파일 에 저장합니다.

Android 에뮬레이터에서 사용하는 파일 시스템은 Realm Studio 실행 하는 시스템에서 직접 액세스할 수 없습니다. 파일에 액세스 하려면 먼저 에뮬레이터에서 파일 을 다운로드 해야 합니다.

먼저 에뮬레이터에서 파일 의 경로를 찾습니다.

// Run this on the device to find the path on the emulator
Realm realm = Realm.getDefaultInstance();
Log.i("Realm", realm.getPath());

그런 다음 ADB를 사용하여 파일 을 다운로드 합니다. 앱 이 실행 동안 이 작업을 수행할 수 있습니다.

> adb pull <path>

ADB를 사용하여 수정된 파일을 다시 업로드할 수도 있지만 이는 앱이 실행되고 있지 않을 때만 가능합니다. 앱이 실행되는 동안 수정된 파일을 업로드하면 파일이 손상될 수 있습니다.

> adb push <file> <path>

참조: 보조 Realm 파일

Realm 은 각 영역 에 대해 추가 파일을 생성합니다. 이러한 파일에 학습 보려면 Realm 내부를 참조하세요.

Realm 은 일반적으로 동등한 SQLite 데이터베이스 보다 디스크 공간을 덜 차지합니다. 그러나 데이터를 일관적인 볼 수 있도록 Realm 은 여러 버전의 영역 에서 작동합니다. 여러 버전의 영역 이 동시에 열리는 경우 영역 파일 에 디스크에 추가 공간이 필요할 수 있습니다.

이러한 버전은 각 트랜잭션의 변경 사항에 따라 많은 공간을 차지합니다. 많은 소규모 트랜잭션은 소수의 대규모 트랜잭션과 동일한 오버헤드를 갖습니다.

예기치 않은 파일 크기 증가는 일반적으로 다음 세 가지 이유 중 하나로 발생합니다.

  1. 배경 스레드에서 영역 을 열고 다시 닫는 것을 잊었습니다. 결과적으로 Realm 은 배경 스레드에 있는 이전 버전의 데이터에 대한 참조를 유지합니다. Realm 은 루퍼가 있는 스레드에서 Realm을 최신 버전으로 자동으로 업데이트하기 때문에 UI 스레드 및 다른 루퍼 스레드에는 이 문제가 없습니다.

  2. 동결된 객체의 너무 많은 버전에 대한 참조를 보유하고 있습니다. 동결된 객체는 객체 가 처음 동결되었을 때 존재했던 영역 버전을 유지합니다. 많은 수의 객체를 동결해야 하는 경우 Realm.copyFromRealm() 대신 필요한 데이터만 보존합니다.

  3. 영역 에서 일부 데이터를 읽습니다. 그런 다음 장기 실행 작업으로 스레드를 차단 합니다. 그동안 다른 스레드에서 영역 에 여러 번 쓰기 (write) . 이로 인해 Realm 은 많은 중간 버전을 생성합니다. 다음과 같은 방법으로 이를 방지할 수 있습니다.

    • 쓰기 일괄 처리

    • 배경 스레드를 차단하는 동안 영역 이 열린 상태로 유지되는 것을 방지합니다.

애플리케이션이 허용된 수보다 많은 Realm 버전을 여는 경우 RealmConfiguration 를 빌드할 때 maxNumberOfActiveVersions() 를 설정하여 IllegalStateException 를 발생시킬 수 있습니다. 버전은 쓰기 트랜잭션(write transaction)을 실행할 때 생성됩니다.

Realm 은 애플리케이션 에서 더 이상 사용하지 않는 이전 버전의 데이터를 자동으로 제거합니다. 그러나 Realm 은 이전 버전의 데이터에서 사용하는 공간을 확보하지 않습니다. 대신 해당 공간은 영역 에 대한 새로운 쓰기에 사용됩니다.

Realm 파일을 압축 하여 사용하지 않는 공간을 제거할 수 있습니다.

  • 수동으로: compactRealm()호출

  • 자동: Android 애플리케이션에서 영역에 대한 첫 번째 연결을 열 때 compactOnLaunch() 빌더 옵션을 지정합니다.

중요

모든 프로덕션 애플리케이션 압축

모든 프로덕션 애플리케이션은 압축을 구현하여 주기적으로 Realm 파일 크기를 줄여야 합니다.

Realm은 Android 기기의 파일을 사용하여 디스크에 Realm을 유지합니다. Realm을 백업하려면 Realm 파일을 찾아 안전한 위치에 복사합니다. Realm을 복사하기 전에 Realm의 모든 인스턴스를 닫아야 합니다.

또는 realm.writeCopyTo() 를 사용하여 영역의 압축 버전을 대상 파일에 쓸 수도 있습니다.

다음도 참조하세요.

영역 을 Google 드라이브와 같은 외부 위치 에 백업하려면 다음 문서 시리즈를 참조하세요: (파트 1, 2파트 3, 파트 ).

Realm 모듈은 영역 에 저장할 수 있는 Realm 객체 설정하다 를 설명합니다. 기본값 으로 Realm 은 애플리케이션 에 정의된 모든 Realm 객체를 포함하는 Realm 모듈을 자동으로 생성합니다. RealmModule 을 정의하여 영역 을 애플리케이션 에 정의된 클래스의 하위 집합으로 제한할 수 있습니다. Realm 을 사용하는 라이브러리를 생성하는 경우 Realm 모듈을 사용하여 라이브러리에 정의된 Realm 객체만 영역 에 명시적으로 포함할 수 있습니다. 이를 통해 라이브러리를 포함하는 애플리케이션은 라이브러리에 정의된 Realm 객체와의 객체 이름 충돌 및 마이그레이션을 관리하지 않고도 Realm 을 사용할 수 있습니다.

돌아가기

Java SDK