동기화된 Realm 구성 - Java SDK
전제 조건
클라이언트에서 동기화된 영역에 액세스하려면 먼저 다음을 수행해야 합니다.
Atlas App Services UI에서 동기화를 활성화합니다 .
애플리케이션 수준
build.gradle
파일의 최상위 수준에 다음을 추가하여 애플리케이션에서 동기화를 활성화합니다.realm { syncEnabled = true } 클라이언트 프로젝트에서 사용자를 인증합니다.
동기화된 Realms
동기화된 영역은 Atlas Device Sync 를 사용하여 클라이언트 기기와 동기화된 데이터 소스 모두에 데이터를 저장합니다. 동기화된 Realm을 여는 것은 SyncConfiguration
를 사용하여 동기화된 Realm의 설정을 사용자 지정한다는 점을 제외하면 로컬 Realm을 여는 것과 동일하게 작동합니다.
동기화된 Realm 구성
Realm에 대한 설정을 구성하려면 SyncConfiguration.Builder를 사용하여 SyncConfiguration 을 만듭니다.
동기화된 Realm을 열려면 SyncConfiguration 객체를 전달하여 getInstanceAsync() 를 호출합니다.
애플리케이션에서 Flexible Sync를 사용하는 경우 SyncConfiguration.InitialFlexibleSyncSubscriptions() 인스턴스와 함께 initialSubscriptions() 동기화 구성 빌더 메서드를 호출하여 동기화된 Realm을 엽니다. configure()
메서드에서 Subscription.create() 를 사용하여 이름과 쿼리로 UnmanagedSubscription
를 인스턴스화합니다. 새 구독을 MutableSubscriptionSet 매개변수의 add()
메서드에 전달하여 구독에 추가합니다.
// instantiate a Realm App connection String appID = YOUR_APP_ID; // replace this with your App ID App app = new App(new AppConfiguration.Builder(appID) .build()); // authenticate a user Credentials credentials = Credentials.anonymous(); app.loginAsync(credentials, it -> { if (it.isSuccess()) { User user = it.get(); // add an initial subscription to the sync configuration SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser()) .initialSubscriptions(new SyncConfiguration.InitialFlexibleSyncSubscriptions() { public void configure(Realm realm, MutableSubscriptionSet subscriptions) { subscriptions.add(Subscription.create("subscriptionName", realm.where(Frog.class) .equalTo("species", "spring peeper"))); } }) .build(); // instantiate a realm instance with the flexible sync configuration Realm.getInstanceAsync(config, new Realm.Callback() { public void onSuccess(Realm realm) { Log.v("EXAMPLE", "Successfully opened a realm."); } }); } else { Log.e("EXAMPLE", "Failed to log in: " + it.getError().getErrorMessage()); } });
// instantiate a Realm App connection val appID: String = YOUR_APP_ID // replace this with your App ID val app = App( AppConfiguration.Builder(appID) .build() ) // authenticate a user val credentials = Credentials.anonymous() app.loginAsync( credentials ) { it: App.Result<User?> -> if (it.isSuccess) { val user = it.get() // add an initial subscription to the sync configuration val config = SyncConfiguration.Builder(app.currentUser()) .initialSubscriptions { realm, subscriptions -> subscriptions.add( Subscription.create( "subscriptionName", realm.where(Frog::class.java) .equalTo("species", "spring peeper") ) ) } .build() // instantiate a realm instance with the flexible sync configuration Realm.getInstanceAsync(config, object : Realm.Callback() { override fun onSuccess(realm: Realm) { Log.v("EXAMPLE", "Successfully opened a realm.") } }) } else { Log.e( "EXAMPLE", "Failed to log in: " + it.error.errorMessage ) } }
중요
UI 스레드의 동기식 읽기 및 쓰기
기본적으로 비동기 트랜잭션을 사용하여 애플리케이션의 UI 스레드에서 영역에 읽기 또는 쓰기만 가능합니다. 즉, 동기 메서드의 사용을 명시적으로 허용하지 않는 한 Android 애플리케이션의 기본 스레드에서 이름이 Async
(이)라는 단어로 끝나는 Realm
메서드만 사용할 수 있습니다.
이러한 제한은 애플리케이션 사용자를 위해 존재합니다. 즉, UI 스레드에서 읽기 및 쓰기 작업을 수행하면 UI 상호 작용이 응답하지 않거나 느려질 수 있으므로 일반적으로 이러한 작업을 비동기적으로 처리하거나 배경 스레드에서 처리하는 것이 가장 좋습니다. 하지만 애플리케이션이 UI 스레드에서 동기 영역 읽기 또는 쓰기를 사용해야 하는 경우 다음 SyncConfiguration
옵션을 사용하여 동기 메서드 사용을 명시적으로 허용할 수 있습니다.
SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser()) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .initialSubscriptions(new SyncConfiguration.InitialFlexibleSyncSubscriptions() { public void configure(Realm realm, MutableSubscriptionSet subscriptions) { subscriptions.add(Subscription.create("springPeepers", realm.where(Frog.class) .equalTo("species", "spring peeper"))); } }) .build(); Realm.getInstanceAsync(config, new Realm.Callback() { public void onSuccess(Realm realm) { Log.v( "EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread."); } });
val config = SyncConfiguration.Builder(app.currentUser()) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .initialSubscriptions { realm, subscriptions -> subscriptions.add( Subscription.create( "subscriptionName", realm.where(Frog::class.java) .equalTo("species", "springPeepers") ) ) } .build() Realm.getInstanceAsync(config, object : Realm.Callback() { override fun onSuccess(realm: Realm) { Log.v( "EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread." ) } })
오프라인 상태에서 동기화된 Realm 열기
온라인 상태에서 동기화된 영역을 여는 데 사용하는 것과 정확히 동일한 구문으로 오프라인 상태에서도 동기화된 영역을 열 수 있습니다. 모든 SDK가 이 패턴을 따르는 것은 아니므로 크로스 플랫폼 개발자는 각 SDK에 대한 설명서를 참조하여 자세한 내용을 확인해야 합니다.
Realm 닫기
Realm 인스턴스에서 리소스를 비우려면 close() 메서드를 호출해야 한다는 점을 기억합니다. Realm을 닫지 않으면 OutOfMemoryError
가 발생할 수 있습니다.
realm.close();
realm.close()