Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

Realm 파일 번들 - Java SDK

이 페이지의 내용

  • 개요
  • 번들링을 위한 Realm 파일 만들기
  • 프로덕션 애플리케이션에 Realm 파일 번들
  • 번들 Realm 파일에서 Realm 열기

참고

동기화된 Realm 번들

SDK 버전 10.9.0에는 동기화된 Realm을 번들로 제공하는 기능이 도입되었습니다. 버전 10.9.0 이전에는 로컬 Realm만 번들로 사용할 수 있었습니다.

Realm은 Realm 파일 번들 을 지원합니다. Realm 파일을 번들로 제공하면 애플리케이션 다운로드에 데이터베이스와 모든 해당 데이터가 포함됩니다.

이를 통해 사용자는 초기 데이터 설정하다 로 애플리케이션을 처음 시작할 수 있습니다. 동기화된 Realm의 경우 번들을 사용하면 사용자가 애플리케이션 을 처음 열 때 시간이 오래 걸리는 초기 다운로드 를 방지할 수 있습니다. 대신 사용자는 번들 파일 을 생성한 이후 발생한 동기화된 변경 사항만 다운로드 해야 합니다.

중요

동기화된 Realm 번들

백엔드 애플리케이션 에서 Flexible Sync 를 사용하는 경우 사용자가 번들 영역 파일 을 처음 열 때 클라이언트 재설정 을 경험할 수 있습니다. 이는 클라이언트 최대 오프라인 시간 이 활성화된 경우(클라이언트 최대 오프라인 시간은 기본값 활성화되어 있음) 발생할 수 있습니다. 사용자가 처음 동기화하기 전에 번들 영역 파일 이 클라이언트 최대 오프라인 시간 설정에 지정된 일수보다 오래 생성된 경우 사용자는 클라이언트 재설정 을 경험하게 됩니다.

클라이언트 재설정을 수행하는 애플리케이션은 애플리케이션 백엔드에서 영역의 전체 상태를 다운로드합니다. 이렇게 하면 Realm 파일을 번들로 제공할 때 얻을 수 있는 이점이 무효화됩니다. 클라이언트 재설정을 방지하고 Realm 파일 번들의 이점을 보존하려면 다음을 수행합니다.

  • 동기화된 영역을 번들로 제공하는 애플리케이션에서는 클라이언트 최대 오프라인 시간을 사용하지 않도록 합니다.

  • 애플리케이션에서 클라이언트 최대 오프라인 시간을 사용하는 경우 애플리케이션 다운로드에 항상 최근에 동기화된 Realm 파일이 포함되어 있는지 확인하세요. 각 애플리케이션 버전마다 새 파일을 생성하고 클라이언트 최대 오프라인 시간 (일)을 초과하는 버전이 최신 상태로 유지되지 않도록 합니다.

Realm 파일을 생성하고 애플리케이션과 함께 번들로 제공하려면 다음과 같이 하세요:

  1. 번들로 제공하려는 데이터가 포함 된 Realm 파일을 만듭니다 .

  2. 프로덕션 애플리케이션의 /<app name>/src/main/assets 폴더에 Realm 파일을 번들로 제공합니다.

  3. 프로덕션 애플리케이션 의 번들 자산 파일 에서 Realm을 엽니다. 동기화된 영역의 경우 파티션 키를 제공해야 합니다.

참고

동일 유형 동기화만 가능

이 방법은 다른 파티션 기반 동기화 사용자를 위한 파티션 기반 동기화 구성 복사 또는 다른 Flexible Sync 사용자를 위한 Flexible Sync 구성 복사만 지원합니다. 이 방법을 사용하여 파티션 기반 동기화 영역과 Flexible Sync 영역 간에 또는 그 반대로 변환할 수 없습니다.

  1. 애플리케이션의 데이터 모델을 공유하는 임시 Realm 앱을 빌드합니다.

  2. Realm을 열고 번들로 제공하려는 데이터를 추가합니다. 동기화된 Realm을 사용하는 경우 Realm이 완전히 동기화될 때까지 기다립니다.

  3. writeCopyTo() 메서드를 사용하여 영역을 새 파일에 복사합니다.

    String appID = YOUR_APP_ID; // replace this with your App ID
    App app = new App(appID);
    Credentials anonymousCredentials = Credentials.anonymous();
    app.loginAsync(anonymousCredentials, it -> {
    if (it.isSuccess()) {
    Log.v("EXAMPLE", "Successfully authenticated anonymously.");
    String PARTITION = "PARTITION_YOU_WANT_TO_BUNDLE";
    // you can only create realm copies on a background thread with a looper.
    // HandlerThread provides a Looper-equipped thread.
    HandlerThread handlerThread = new HandlerThread("CopyARealmHandler");
    handlerThread.start();
    Handler handler = new Handler(handlerThread.getLooper());
    handler.post(new Thread(new Runnable() { @Override public void run() {
    SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser(), PARTITION)
    // wait for the realm to download all data from the backend before opening
    .waitForInitialRemoteData()
    .build();
    Realm realm = Realm.getInstance(config);
    Log.v("EXAMPLE", "Successfully opened a realm.");
    // write a copy of the realm you can manually copy to your production application assets
    File outputDir = activity.getApplicationContext().getCacheDir();
    File outputFile = new File(outputDir.getPath() + "/" + PARTITION + "_bundled.realm");
    // ensure all local changes have synced to the backend
    try {
    app.getSync().getSession(config).uploadAllLocalChanges(10000, TimeUnit.MILLISECONDS);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    // cannot write to file if it already exists. Delete the file if already there
    outputFile.delete();
    realm.writeCopyTo(outputFile);
    // search for this log line to find the location of the realm copy
    Log.i("EXAMPLE", "Wrote copy of realm to " + outputFile.getAbsolutePath());
    // always close a realm when you're done using it
    realm.close();
    }}));
    } else {
    Log.e("EXAMPLE", "Failed to authenticate: " + it.getError().toString());
    }
    });
    val appID: String = YOUR_APP_ID // replace this with your App ID
    val app = App(appID)
    val anonymousCredentials = Credentials.anonymous()
    app.loginAsync(anonymousCredentials) { it: App.Result<User?> ->
    if (it.isSuccess) {
    Log.v("EXAMPLE", "Successfully authenticated anonymously.")
    val PARTITION = "PARTITION_YOU_WANT_TO_BUNDLE"
    // you can only create realm copies on a background thread with a looper.
    // HandlerThread provides a Looper-equipped thread.
    val handlerThread = HandlerThread("CopyARealmHandler")
    handlerThread.start()
    val handler = Handler(handlerThread.looper)
    handler.post(Thread {
    val config = SyncConfiguration.Builder(app.currentUser(), PARTITION)
    // wait for the realm to download all data from the backend before opening
    .waitForInitialRemoteData()
    .build()
    val realm : Realm = Realm.getInstance(config);
    Log.v("EXAMPLE", "Successfully opened a realm.")
    // write a copy of the realm you can manually copy to your production application assets
    val outputDir = activity!!.applicationContext.cacheDir
    val outputFile =
    File(outputDir.path + "/" + PARTITION + "_bundled.realm")
    // ensure all local changes have synced to the backend
    try {
    app.sync.getSession(config)
    .uploadAllLocalChanges(10000, TimeUnit.MILLISECONDS)
    } catch (e: InterruptedException) {
    e.printStackTrace()
    }
    // cannot write to file if it already exists. Delete the file if already there
    outputFile.delete()
    realm.writeCopyTo(outputFile)
    // search for this log line to find the location of the realm copy
    Log.i("EXAMPLE", "Wrote copy of realm to " + outputFile.absolutePath)
    // always close a realm when you're done using it
    realm.close()
    })
    } else {
    Log.e("EXAMPLE", "Failed to authenticate: ${it.error}")
    }
    }

    writeCopyTo() 복사하기 전에 Realm을 가능한 가장 작은 크기로 자동으로 압축합니다.

    동기화된 Realm과 로컬 전용 Realm의 차이점

    위의 예에서는 SyncConfiguration 를 사용하여 동기화된 Realm을 구성합니다. 로컬 Realm의 복사본을 만들려면 대신 RealmConfiguration 로 Realm을 구성합니다.

이제 초기 데이터가 포함된 Realm의 복사본이 있으므로 이를 프로덕션 애플리케이션과 번들로 제공합니다.

  1. 애플리케이션 로그를 검색하여 방금 생성한 Realm 파일 복사본의 위치를 찾습니다.

  2. Android Studio 창의 오른쪽 하단에 있는 'Device File Explorer' 위젯을 사용하여 파일로 이동합니다.

  3. 파일을 마우스 오른쪽 버튼으로 클릭하고 "다른 이름으로 저장"을 선택합니다. 프로덕션 애플리케이션의 /<app name>/src/main/assets 폴더로 이동합니다. 해당 위치에 Realm 파일의 복사본을 저장합니다.

자산 폴더

애플리케이션에 자산 폴더가 아직 포함되어 있지 않은 경우 Android Studio에서 최상위 애플리케이션 폴더(<app name>)를 마우스 오른쪽 버튼으로 클릭하고 메뉴에서 New > Folder > Assets Folder 를 선택하여 만들 수 있습니다.

이제 프로덕션 애플리케이션 에 포함된 영역 의 복사본이 있으므로 이를 사용하려면 코드를 추가해야 합니다. 번들 파일 에서 영역 을 열도록 영역 을 구성할 때 자산 파일() 메서드를 사용합니다.

String appID = YOUR_APP_ID; // replace this with your App ID
App app = new App(appID);
Credentials anonymousCredentials = Credentials.anonymous();
app.loginAsync(anonymousCredentials, it -> {
if (it.isSuccess()) {
Log.v("EXAMPLE", "Successfully authenticated anonymously.");
// asset file name should correspond to the name of the bundled file
SyncConfiguration config = new SyncConfiguration.Builder(
app.currentUser(),
"PARTITION_YOU_WANT_TO_BUNDLE")
.assetFile("example_bundled.realm")
.build();
Realm realm = Realm.getInstance(config);
Log.v("EXAMPLE", "Successfully opened bundled realm.");
// read and write to the bundled realm as normal
realm.executeTransactionAsync(transactionRealm -> {
Frog frog = new Frog(new ObjectId(),
"Asimov",
4,
"red eyed tree frog",
"Spike");
transactionRealm.insert(frog);
expectation.fulfill();
});
} else {
Log.e("EXAMPLE", "Failed to authenticate: " + it.getError().toString());
}
});
val appID: String = YOUR_APP_ID // replace this with your App ID
val app = App(appID)
val anonymousCredentials = Credentials.anonymous()
app.loginAsync(anonymousCredentials) { it: App.Result<User?> ->
if (it.isSuccess) {
Log.v("EXAMPLE", "Successfully authenticated anonymously.")
// asset file name should correspond to the name of the bundled file
val config = SyncConfiguration.Builder(
app.currentUser(),
"PARTITION_YOU_WANT_TO_BUNDLE")
.assetFile("example_bundled.realm")
.build()
val realm: Realm = Realm.getInstance(config)
Log.v("EXAMPLE", "Successfully opened bundled realm.")
// read and write to the bundled realm as normal
realm.executeTransactionAsync { transactionRealm: Realm ->
val frog = Frog(
ObjectId(),
"Asimov",
4,
"red eyed tree frog",
"Spike"
)
transactionRealm.insert(frog)
expectation.fulfill()
}
} else {
Log.e("EXAMPLE", "Failed to authenticate: ${it.error}")
}
}

동기화된 Realm과 로컬 전용 Realm의 차이점

위의 예에서는 SyncConfiguration 를 사용하여 동기화된 Realm을 구성합니다. 로컬 Realm의 복사본을 만들려면 대신 RealmConfiguration 로 Realm을 구성합니다.

돌아가기

Realm 열기 및 닫기