Docs Menu
Docs Home
/ /
Atlas Device SDK
/

Realm ファイルの操作 - Java SDK

項目一覧

  • Realm のライフサイクル
  • マルチプロセス
  • Realm スキーマ
  • 同期された Realm
  • Realm ファイルの検索
  • Realm ファイルのサイズ
  • アクティブなバージョンの最大数を制限する
  • Realm の圧縮
  • Realm のバックアップと復元
  • Modules

Realmは、事前定義されたスキーマに準拠する、関連するオブジェクトのセットです。 Realm には複数のデータタイプがある限り、各タイプに対応するスキーマが存在する限り、複数のデータタイプを含めることができます。

すべての Realm は、Realm 内の各オブジェクトのバイナリ エンコーディングを含む個別の Realm ファイルにデータを保存します。 複数のデバイス間で Realm を自動的に同期し、Realm 内のオブジェクトが作成、変更、または削除されるたびにを呼び出すリアクティブなイベント ハンドラーを設定できます。

すべての Realm インスタンスは大量のリソースを消費します。 Realm を開くことと閉じるはいずれもコストのかかる操作ですが、Realm を開いたままにしておくとリソースのオーバーヘッドが大きくなります。 アプリケーションのパフォーマンスを最大化するには、常にオープンするRealmの数を最小限に抑え、使用されるオープン操作と閉じる操作の数を制限する必要があります。

ただし、Realm を開くには必ず一貫したコストがかかるわけではありません。 Realm が同じプロセスまたはスレッド内ですでに開いている場合、追加の インスタンスを開くには必要なリソースが少なくなります。

  • 同じプロセス内で Realm が開かれていない場合、Realm を開くにはコストがかかります。

  • Realm が同じプロセス内の別のスレッドですでに開いている場合、Realm を開くのコストは少なくなりますが、簡単ではありません。

  • Realm が同じプロセス内の同じスレッドですでに開いている場合、Realm を開くには最小限の追加リソースが必要です。

Realm を初めて開くと、Realm は、Realm へのデータの読み取りと書込みに必要なメモリ マッピングとスキーマの検証を実行します。 同じスレッド上のその Realm の追加インスタンスは、同じ基礎のリソースを使用します。 別々のスレッド上のその Realm のインスタンスは、同じ基礎のリソースの一部を使用します。

Realm へのすべての接続がスレッド内で閉じられると、Realm はその Realm への接続に使用されたスレッド リソースを解放します。 プロセス内で Realm へのすべての接続が閉じられると、Realm はその Realm への接続に使用されるすべてのリソースを解放します。

ベストプラクティスとして、Realm インスタンスのライフサイクルと、Realm を観察するビューのライフサイクルを関連付けることをお勧めします。 たとえば、 Fragmentを介してRealmResultsデータを表示する RecyclerViewを考えてみましょう。 次のことが可能です。

  • Fragment.onCreateView()ライフサイクル メソッドで、そのビューのデータを含む単一のRealmを開きます。

  • Fragment.onDestroyView()ライフサイクル メソッドで同じレルムを閉じます。

注意

Realm が特に大きい場合、 Fragment.onCreateView()で Realm インスタンスを取得すると、レンダリングが一時的にブロックされる可能性があります。 onCreateView()で Realm を開くとパフォーマンスの問題が発生する場合は、代わりにFragment.onStart()Fragment.onStop()から Realm を管理することを検討してください。

複数のFragmentインスタンスが同じデータセットにアクセスする必要がある場合は、 Activityを囲む で単一の Realm を管理できます。

  • Activity.onCreate()ライフサイクル メソッドでRealmを開きます。

  • Activity.onDestroy()ライフサイクル メソッドでRealmを閉じます。

暗号化された Realm または同期された Realm には、異なるプロセスから同時にアクセスすることはできません。 ただし、ローカル Realm はプロセス全体で正常に機能するため、読み取り、書き込み、複数の APK からの通知を受信することができます。

Realm スキーマは、アプリが永続化できるオブジェクトタイプをそれぞれ定義する有効なオブジェクト スキーマのリストです。 Realm 内のすべてのオブジェクトは Realm スキーマに準拠する必要があります。

デフォルトでは、SDK はプロジェクト内のRealmObjectから派生するすべてのクラスを Realm スキーマに自動的に追加します。

クライアント アプリケーションは、Realm を開くときに Realm スキーマを提供します。 Realm にすでにデータが含まれている場合、Realm は既存の各オブジェクトを検証し、そのタイプにオブジェクト スキーマが提供されていること、およびスキーマで指定されたすべての制約を満たしていることを確認します。

ライブラリ内の書籍に関する基本データを含む Realm では、次のようなスキーマを使用する場合があります。

[
{
"type": "Library",
"properties": {
"address": "string",
"books": "Book[]"
}
},
{
"type": "Book",
"primaryKey": "isbn",
"properties": {
"isbn": "string",
"title": "string",
"author": "string",
"numberOwned": { "type": "int?", "default": 0 },
"numberLoaned": { "type": "int?", "default": 0 }
}
}
]

Atlas Device Sync を使用するアプリは、同期された Realm を開くことができます。

Flexible Syncを使用すると、 クエリ をサブスクライブすることで、クライアント アプリケーションが同期するデータをカスタマイズできます。 これらのクエリはアプリ バックエンド内のデータを検索し、Flexible Sync レルムはクエリに一致するデータを同期します。 クライアント・アプリケーションは、ユーザーがデータにアクセスするための適切な読み取りまたは読み取りおよび書込み権限を持つ場合にのみ、データを同期できます。

Flexible Syncを使用する場合、同期された Realm は Atlas データのパーティションを表します。 各邦土は、アプリのデータソース内のデータのサブセットに対応します。 アプリケーションの パーティション キー を使用して、データの パーティション分割 をカスタマイズできます。パーティション値と呼ばれる パーティション キーの一意の値は、個々の Realm に対応します。

Realm ルールを構成するときに、同期された Realm がアプリから読み書きできるデータの権限をカスタマイズできます。

詳細については、「 同期済み Realm の構成 - Java SDK 」を参照してください。

Realm は、Realm 内のすべてのオブジェクトとタイプのバイナリ エンコード バージョンを単一の.realmファイルに保存します。

Android エミュレータで使用されるファイルシステムは、Realm Studio を実行しているマシンから直接アクセスできません。 次のファイルにアクセスする前に、エミュレータから ファイルをダウンロードする必要があります。

まず、エミュレータで ファイルのパスを見つけます。

// Run this on the device to find the path on the emulator
Realm realm = Realm.getDefaultInstance();
Log.i("Realm", realm.getPath());

次に、ADDB を使用してファイルをダウンロードします。 これはアプリの実行中に実行できます。

> adb pull <path>

また、アプリが実行されていない場合にのみ、 ADB を使用して変更されたファイルを再度アップロードすることもできます。 アプリの実行中に変更されたファイルをアップロードすると、ファイルが破損する可能性があります。

> adb push <file> <path>

Tip

「 予備 Realm ファイル 」も参照してください

Realm は、Realm ごとに追加のファイルを作成します。 これらのファイルの詳細については、「 Realm の内部 」を参照してください。

Realm は通常、同等の SQLite データベースよりもディスク上で消費するスペースが少なくなります。 ただし、データの一貫したビューを提供するために、Realm は複数のバージョンの Realm で動作します。 多数のバージョンの Realm が同時に開かれる場合、Realm ファイルにはディスク上に追加の領域が必要になる可能性があります。

これらのバージョンは、各トランザクションの変更量に応じて異なるスペースの量を消費します。 多数の小規模なトランザクションは、少数の 大規模なトランザクション と同じオーバーヘッドを持ちます。

予期しないファイル サイズの増加は通常、次の 3 つの理由のいずれかで発生します。

  1. バックグラウンド スレッドで Realm を開き、再度閉じるのを忘れる。 その結果、Realm はバックグラウンド スレッド上の古いバージョンのデータへの参照を保持します。 Realm は、ルーパーを持つスレッドの Realm を最新バージョンに自動的にアップデートするため、UI スレッドやその他の ルーパー スレッドにはこの問題は発生しません。

  2. 固定オブジェクトのバージョンが多すぎる参照を保持している場合。 凍結されたオブジェクトは、オブジェクトが最初に固定されたときに存在していた Realm のバージョンを保持します。 多数のオブジェクトをフリーズする必要がある場合は、 Realm. copyFromRealm()の使用を検討してください 必要なデータのみを保持するため

  3. Realm からいくつかのデータを読み取ります。次に、長時間実行される操作でスレッドをブロックします。同時に、他のスレッド上の Realm に何度か書き込みを行います。 これにより、Realm は多数の中間バージョンを作成します。 これは次の方法で回避できます。

    • 書込み (write) のバッチ処理

    • バックグラウンド スレッドをブロックしながら、Realm を開いたままにしないようにします。

アプリケーションが許可された数より多くのバージョンの Realm を開く場合にIllegalStateExceptionをスローするように、 RealmConfigurationをビルドするときにmaxNumberOfActiveVersions()を設定できます。 バージョンは書込みトランザクションの実行中に作成されます。

Realm は、アプリケーションで使用されなくなると、古いバージョンのデータを自動的に削除します。 ただし、Realm は古いバージョンのデータで使用されている領域を解放するものではありません。代わりに、そのスペースは Realm への新しい書込み (write) に使用されます。

Realm ファイルを圧縮することで、未使用のスペースを排除できます。

  • 手動: compactRealm() の呼び出し

  • 自動的に: Android アプリケーションで Realm への最初の接続を開くときに、 compactOnLaunch()ビルダ オプションを指定します

重要

すべての本番アプリケーションを圧縮

すべての本番アプリケーションでは、Realm ファイルのサイズを定期的に縮小するために圧縮を実装する必要があります。

Realm は、Android デバイス上のファイルを使用して、Realm をディスクに永続化します。 Realm をバックアップするには、Realm ファイルを見つけて安全な場所にコピーします。 Realm をコピーする前に、Realm のすべてのインスタンスを閉じる必要があります。

あるいは、 Realm.writeCopyTo()を使用して、Realm の圧縮されたバージョンを宛先ファイルに書込むこともできます。

Tip

以下も参照してください。

Google ドライブなどの外部ロケーションに邦土をバックアップする場合は、次の記事シリーズを参照してください。( 一部の 1 2部分3 、 部分 )。

Realm モジュールは、Realm に保存できる Realm オブジェクトのセットを記述します。 デフォルトでは、Realm は、アプリケーションで定義されたすべての Realm オブジェクトを含む Realm モジュールを自動的に作成します。 RealmModleを定義して、Realm をアプリケーションで定義されたクラスのサブセットに制限できます。 Realm を使用するライブラリを作成する場合は、Realm モジュールを使用して、ライブラリに定義された Realm オブジェクトのみを Realm に明示的に含めることができます。 これにより、ライブラリを含むアプリケーションでも、ライブラリの定義済み Realm オブジェクトとのオブジェクト名競合や移行を管理することなく、Realm を使用できるようになります。

戻る

Java SDK