Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

동기화된 Realm 구성 - Java SDK

이 페이지의 내용

  • 전제 조건
  • 동기화된 Realms
  • 동기화된 Realm 구성
  • 오프라인 상태에서 동기화된 Realm 열기
  • Realm 닫기

참고

새 Java SDK 앱은 RealmAny를 사용할 수 없습니다.

새로운 App Services 앱 은 데이터 모델을 RealmAny 유형의 속성과 동기화할 수 없습니다.

클라이언트에서 동기화된 영역에 액세스하려면 먼저 다음을 수행해야 합니다.

  1. Atlas App Services UI에서 동기화를 활성화합니다 .

  2. 앱 초기화

  3. 애플리케이션 수준 build.gradle 파일의 최상위 수준에 다음을 추가하여 애플리케이션에서 동기화를 활성화합니다.

    realm { syncEnabled = true }
  4. 클라이언트 프로젝트에서 사용자를 인증합니다.

동기화된 영역은 Atlas Device Sync 를 사용하여 클라이언트 기기와 동기화된 데이터 소스 모두에 데이터를 저장합니다. 동기화된 Realm을 여는 것은 SyncConfiguration 를 사용하여 동기화된 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() {
@Override
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() {
@Override
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() {
@Override
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() {
@Override
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."
)
}
})

온라인 상태에서 동기화된 영역을 여는 데 사용하는 것과 정확히 동일한 구문으로 오프라인 상태에서도 동기화된 영역을 열 수 있습니다. 모든 SDK가 이 패턴을 따르는 것은 아니므로 크로스 플랫폼 개발자는 각 SDK에 대한 설명서를 참조하여 자세한 내용을 확인해야 합니다.

Realm 인스턴스에서 리소스를 비우려면 close() 메서드를 호출해야 한다는 점을 기억합니다. Realm을 닫지 않으면 OutOfMemoryError 가 발생할 수 있습니다.

realm.close();
realm.close()

돌아가기

데이터 동기화