동기화된 Realm 열기 - Flutter SDK
이 페이지에서는 Realm Mobile Sync를 사용하여 동기화된 영역을 여는 방법에 대해 설명합니다. 동기화되지 않은 Realm을 열고 구성하는 방법을 알아보려면 Realm 열기 및 닫기를 참조하세요.
시작하기 전에
Flutter 애플리케이션에서 Flexible Sync로 영역을 열기 전에 다음을 수행하세요.
백엔드에서 Flexible Sync를 구성합니다. 클라이언트 애플리케이션에서 사용하려면 먼저 백엔드에서 Flexible Sync를 구성해야 합니다.
클라이언트 프로젝트에서 사용자를 인증합니다.
동기화된 Realm 열기
동기화된 영역 을 열려면 로그인한 사용자, Realm 객체 스키마 목록 및 추가 선택적 명명된 인수를 Configuration.flexibleSync() 생성자. 이 생성자는 FlexibleSyncConfiguration 을 반환합니다.FlexibleSyncConfiguration
. 그런 다음 을(를) Realm () 에 전달합니다. 영역 인스턴스 를 엽니다. 영역 을 연 후 데이터가 배경 에서 App Services 와 동기화됩니다.
final currentUser = await app.logIn(credentials); final config = Configuration.flexibleSync(currentUser, [Tricycle.schema], path: 'flex.realm'); final realm = Realm(config);
동기화된 영역을 연 후 동기화 구독을 managed.
변경 사항 다운로드 후 Realm 열기
Realm을 열 때 모든 데이터를 Atlas App Services와 동기화하려면 비동기 메서드 Realm.open() 을 사용합니다. . 이 작업은 Realm을 반환하기 전에 사용 가능한 모든 데이터를 동기화합니다.
처음 열 때 Realm.open()
은(는) 동기화 구독과 일치하는 모든 데이터를 다운로드합니다. 이후 열기는 최신 변경 사항만 다운로드합니다. 초기 영역 크기와 장치가 동기화되지 않는 동안 데이터 세트에 대한 업데이트에 따라, 처음 열 때는 성능이 느려지고 이후 열 때 빨라질 수 있습니다.
클라이언트 애플리케이션이 오프라인 상태인 경우 Realm.open()
이(가) 확인되지 않습니다. Realm.open()
을(를) 사용하기 전에 장치가 인터넷에 연결되어 있는지 확인해야 합니다. 장치가 인터넷에 연결되어 있지 않은 경우에도 Realm()
를 사용하여 즉시 영역을 열고 인터넷 연결이 가능할 때 백그라운드에서 데이터를 동기화할 수 있습니다.
// Helper function to check if device is connected to the internet. Future<bool> isDeviceOnline() async { // ...logic to check if device is online } final config = Configuration.flexibleSync(currentUser, [Tricycle.schema]); // Only use asynchronous open if app is online. late Realm realm; if (await isDeviceOnline()) { // If the device is online, download changes and then open the realm. realm = await Realm.open(config); } else { // If the device is offline, open the realm immediately // and automatically sync changes in the background when the device is online. realm = Realm(config); }
동기화 상태를 추적하려면 ProgressCallback 을 전달합니다. 선택적 명명된 인수 onProgressCallback
에 추가합니다.
double progressEstimate = -1; final realm = await Realm.open(config, onProgressCallback: (syncProgress) { progressEstimate = syncProgress.progressEstimate; print('Sync progress: ${progressEstimate * 100}% complete.'); if (progressEstimate == 1.0) { // Transfer is complete } });
팁
Realm을 연 후 진행 상황 알림 을 구성하려면 영역 을 사용 하세요.
진행 중인 동기화를 취소하려면 CancellationToken 을 cancellationToken
전달합니다. 인스턴스를 선택적 명명된 인수 에 추가합니다. CancellationToken.cancel()을 호출합니다. 동기화를 취소합니다.
final token = CancellationToken(); // Cancel the open operation after 30 seconds. // Alternatively, you could display a loading dialog and bind the cancellation // to a button the user can click to stop the wait. Future<void>.delayed( const Duration(seconds: 30), () => token.cancel(CancelledException( cancellationReason: "Realm took too long to open"))); // If realm does not open after 30 seconds with asynchronous Realm.open(), // open realm immediately with Realm() and try to sync data in the background. late Realm realm; try { realm = await Realm.open(config, cancellationToken: token); } on CancelledException catch (err) { print(err.cancellationReason); // prints "Realm took too long to open" realm = Realm(config); }
예시
Realm() 대 Realm.open()
이 섹션에서는 Realm()
와 Realm.open()
를 사용하여 애플리케이션에서 영역을 열 수 있는 시나리오의 예를 비교합니다.
사용자가 좋아하는 레시피를 기록하고 저장할 수 있는 앱을 생각해 보세요. 사용자에게 업데이트를 다운로드할 때까지 기다리지 않고 또는 오프라인 상태일 때도 새 레시피를 만들 수 있는 옵션을 제공할 수 있습니다. 이 경우 Realm()
이 바람직합니다. 사용자는 오프라인으로 작업할 수 있지만 다음에 네트워크에 연결될 때 앱이 레시피를 동기화합니다.
타블렛과 휴대폰 버전이 있는 게임 앱을 예로 들어 보겠습니다. 사용자가 테이블과 휴대폰 양쪽에서 게임을 하고 있습니다. 사용자는 타블렛에서 세 가지 레벨을 진행합니다. 나중에 사용자가 휴대폰에서 게임을 엽니다. In this case, Realm.open()
is a better way to open the realm. Realm.open()
는 영역을 반환하기 전에 데이터를 동기화하므로 초기 로드 시간이 더 느릴 수 있는 경우에도 앱 사용을 시작하기 전에 사용자의 진행 상황이 전화에 동기화되는지 확인합니다.
Realm 구성
일반 영역 구성 옵션에 대한 자세한 내용은 Realm 구성을 참조하세요.
추가 구성 속성을 사용하여 동기화된 영역의 오류를 처리하려면 동기화 오류 처리를 참조하세요.
Realm 닫기
동기화된 영역 작업을 마친 후에는 메모리 누수를 방지하기 위해 닫습니다.
realm.close();
추가 읽기
managed 동기화 구독: 동기화된 영역을 연 후 동기화 구독을 추가, 수정 및 제거하는 방법을 알아보세요.
managed 동기화 세션: 동기화 일시 중지 및 다시 시작, 업로드 및 다운로드 진행 상황 모니터링, 네트워크 연결 확인 등 managed 동기화 세션을 알아보세요.
여러 프로세스의 데이터 동기화 : 여러 프로세스 의 데이터를 단일 영역과 동기화하는 방법을 알아봅니다.