Realm 구성 및 열기 - Flutter SDK
이 페이지의 내용
Realm 열기
구성 사용 클래스를 사용하여 스키마 를 포함하여 열려는 영역 의 세부 사항을 제어할 수 있습니다.
로컬 전용 Realm 열기
데이터를 로컬에만 유지하는 영역을 만들려면 Configuration.local()을 사용하여 구성을 만듭니다. 스키마 목록을 인수로 제공해야 합니다.
Configuration
Realm 생성자에 전달합니다.
final config = Configuration.local([Car.schema]); final realm = Realm(config);
이제 해당 영역 인스턴스를 사용하여 데이터베이스의 객체로 작업할 수 있습니다.
동기화된 Realm 열기
Device Sync를 사용하여 Atlas와 데이터를 동기화하는 영역을 열려면 동기화된 영역 열기를 참조하세요.
In-Memory Realm 열기
지속되지 않고 메모리에서 실행되는 영역을 만들려면 Configuration.inMemory()를 사용하여 Configuration
을 만듭니다. 스키마 목록을 인수로 제공해야 합니다. 인메모리 영역은 동시에 읽기 전용일 수 없습니다.
Configuration
을 Realm 에 전달 생성자.
final config = Configuration.inMemory([Car.schema]); final realm = Realm(config);
Realm 구성
영역의 Configuration
에 선택적 속성을 추가할 수 있습니다.
읽기 전용 Realm 열기
기존 영역을 읽기 전용 모드로 열 수 있습니다. 읽기 전용 영역을 열려면 Configuration
객체에 readOnly: true
를 추가합니다.
기존 영역은 읽기 전용 모드로만 열 수 있습니다. 읽기 전용 영역에 쓰기를 시도하면 오류가 발생합니다.
final config = Configuration.local([Car.schema], isReadOnly: true); final realm = Realm(config);
사용자 지정 FIFO 특수 파일 설정
Realm의 FIFO 특수 파일 값 설정 위치. 영역 을 열면 스레드와 프로세스 전반에서 영역 에 액세스 를 조정하는 여러 개의 경량 FIFO 특수 파일이 생성됩니다. 영역 파일 이 FIFO 특수 파일(예: FAT32 파일 시스템) 생성을 허용하지 않는 위치 에 있는 경우 영역 을 열 수 없습니다. 이 경우 Realm 은 이러한 파일을 저장 하기 위해 다른 위치 가 필요합니다. Configuration
객체 에 fifoFilesFallbackPath: <Your Custom FIFO File Path>
를 추가합니다.
영역 파일의 디렉토리에서 FIFO 특수 파일을 허용하는 경우 이 속성은 무시됩니다.
final config = Configuration.local([Car.schema], fifoFilesFallbackPath: "./fifo_folder"); final realm = Realm(config);
Realm에 초기 데이터 추가
initialDataCallback() 사용 영역 을 처음 열 때 콜백 함수를 호출합니다. 이 함수는 장치에서 해당 영역 을 처음 열 때만 실행됩니다. 콜백 함수에 전달된 영역 인스턴스 에는 이미 쓰기 트랜잭션 (write transaction) (write transaction)이 열려 있으므로 쓰기 (write) 작업을 Realm.write()
트랜잭션 차단 으로 래핑할 필요가 없습니다. initialDataCallback
는 기기에서 애플리케이션을 처음 열 때 애플리케이션 에 초기 데이터를 추가하는 데 유용할 수 있습니다.
void dataCb(Realm realm) { realm.add(Car(ObjectId(), 'Honda')); } final config = Configuration.local([Car.schema], initialDataCallback: dataCb); final realm = Realm(config); Car honda = realm.all<Car>()[0];
기본 구성 사용자 지정
Realm이 데이터베이스 파일을 저장하는 기본 경로와 데이터베이스 파일에 부여된 기본 이름을 사용자 지정할 수 있습니다.
애플리케이션 내에서 열린 모든 영역에 대한 기본 구성을 설정하려면 정적 Configuration.defaultRealmName 및 Configuration.defaultRealmPath를 사용합니다.
Configuration.defaultRealmName = "myRealmName.realm"; final customDefaultRealmPath = path.join( (await Directory.systemTemp.createTemp()).path, Configuration.defaultRealmName); Configuration.defaultRealmPath = customDefaultRealmPath; // Configurations used in the application will use these values final config = Configuration.local([Car.schema]); // The path is your system's temp directory // with the file named 'myRealmName.realm' print(config.path);
정적 게터 Configuration.defaultStoragePath 를 사용하여 Realm이 기본적으로 파일을 저장하는 위치를 확인할 수도 있습니다. . 이 속성의 값은 SDK를 사용하는 플랫폼과 Realm의 Dart 또는 Flutter 버전을 사용하는지 여부에 따라 달라집니다. 환경에서 영역 파일이 저장되는 위치를 확인하려면 애플리케이션에서 Configuration.defaultStoragePath
값을 확인하세요.
final storagePath = Configuration.defaultStoragePath; // See value in your application print(storagePath);
스키마 변경 관리
영역을 설정할 때 스키마 변경을 관리하는 방법에 대한 자세한 내용은 영역 객체 스키마 업데이트하기 설명서를 참조하세요.
Realm 암호화
로컬 영역을 암호화하여 데이터 보안을 유지할 수 있습니다. 자세한 내용은 Realm 암호화를 참조하세요.
Realm 축소
리소스가 제한된 환경에서 영역 파일 크기를 줄여 성능을 개선하고 파일 크기를 관리할 수 있습니다. 자세한 내용은 Realm 압축을 참조하세요.
Realm 닫기
영역 작업을 마친 후에는 메모리 누수를 방지하기 위해 영역을 닫습니다.
realm.close();
영역 작업을 마친 후에는 메모리 누수를 방지하기 위해 영역을 닫습니다.
realm.close();
애플리케이션 을 실행 하는 Dart CLI 경우 프로세스 가 중단되는 것을 방지하려면 Realm.shutdown()을 호출하세요.
Realm.shutdown();
새 Realm으로 데이터 복사
기존 Realm에서 다른 구성 옵션이 있는 새 영역 으로 데이터를 복사하려면 새 구성을 Realm .writeCopy() 영역 전달합니다.
새 영역 구성에서 path
를 반드시 지정해야 합니다. 이미 파일이 있는 경로에는 쓸 수 없습니다.
Realm.writeCopy()
를 사용하여 다음 구성 유형 간에 변환할 수 있습니다.
LocalConfiguration
toLocalConfiguration
FlexibleSyncConfiguration
toFlexibleSyncConfiguration
InMemoryConfiguration
toInMemoryConfiguration
LocalConfiguration
읽기 전용LocalConfiguration
으로 또는 그 반대로 변환InMemoryConfiguration
LocalConfiguration
으로 또는 그 반대로 변롼FlexibleSyncConfiguration
toLocalConfiguration
FlexibleSyncConfiguration
toInMemoryConfiguration
LocalConfiguration
또는 InMemoryConfiguration
에서 FlexibleSyncConfiguration
으로 변환할 수 없습니다 .
Realm.writeCopy()
사용하는 동안 염두에 두어야 할 몇 가지 추가 고려사항은 다음과 같습니다.
대상 파일이 이미 존재할 수 없습니다.
쓰기 트랜잭션(write transaction) 내에서 또는 마이그레이션 중에는 영역 복사가 허용되지 않습니다.
Device Sync를 사용하는 경우 복제본을 서버와 동기화하기 전에 모든 로컬 변경 사항을 동기화해야 합니다. 이렇게 하면 파일을 새로 설치된 애플리케이션의 시작점으로 사용할 수 있습니다. 보류 중인 업로드가 있는 경우
Realm.writeCopy()
가 발생합니다.
다음 예에서는 InMemoryConfiguration
이 있는 영역의 데이터를 LocalConfiguration
이 있는 새 영역으로 복사합니다.
// Create in-memory realm and add data to it. // Note that even though the realm is in-memory, it still has a file path. // This is because in-memory realms still use memory-mapped files // for their operations; they just don't persist data across launches. final inMemoryRealm = Realm(Configuration.inMemory([Person.schema], path: 'inMemory.realm')); inMemoryRealm.write(() { inMemoryRealm.addAll([Person("Tanya"), Person("Greg"), Person("Portia")]); }); // Copy contents of `inMemoryRealm` to a new realm with `localConfig`. // `localConfig` uses the default file path for local realms. final localConfig = Configuration.local([Person.schema]); inMemoryRealm.writeCopy(localConfig); // Close the realm you just copied when you're done working with it. inMemoryRealm.close(); // Open the local realm that the data from `inMemoryRealm` // was just copied to with `localConfig`. final localRealm = Realm(localConfig); // Person object for "Tanya" is in `localRealm` because // the data was copied over with `inMemoryRealm.writeCopy()`. final tanya = localRealm.find<Person>("Tanya");
복사된 영역의 구성에 새 암호화 키를 포함하거나 새 구성에서 암호화 키를 제거할 수도 있습니다.
다음은 LocalConfiguration
이 있는 암호화되지 않은 영역에서 LocalConfiguration
이 있는 암호화된 영역으로 데이터를 복사하는 예시입니다.
// Create unencrypted realm and add data to it. final unencryptedRealm = Realm(Configuration.local([Person.schema])); unencryptedRealm.write(() => unencryptedRealm.addAll([ Person("Daphne"), Person("Harper"), Person("Ethan"), Person("Cameron") ])); // Create encryption key and encrypted realm. final key = List<int>.generate(64, (i) => Random().nextInt(256)); final encryptedConfig = Configuration.local([Person.schema], path: 'encrypted.realm', encryptionKey: key); // Copy the data from `unencryptedRealm` to a new realm with // the `encryptedConfig`. The data is encrypted as part of the copying. unencryptedRealm.writeCopy(encryptedConfig); // Close the realm you just copied when you're done working with it. unencryptedRealm.close(); // Open the new encrypted realm with `encryptedConfig`. final encryptedRealm = Realm(encryptedConfig); // Person object for "Harper" is in `localRealm` because // the data was copied over with `unencryptedRealm.writeCopy()`. final harper = encryptedRealm.find<Person>('Harper');