モデル データ - Java SDK
オブジェクト スキーマは、Realm オブジェクトタイプのフィールドと関係を定義する構成オブジェクトです。 Android Realm アプリケーションは、Realm スキーマを使用して Java または Kotlin クラスでオブジェクト スキーマを定義します。
オブジェクト スキーマは、各フィールドのデータ型、フィールドが必須かどうか、デフォルトのフィールド値など、オブジェクト フィールドに制約を指定します。 スキーマは、Realm 内のオブジェクトタイプ間の関係を定義することもできます。
アプリケーションの Realm スキーマを変更するには、Realm スキーマの古いバージョンから新しいバージョンにデータを移行する必要があります。
Realm アプリ
すべてのアプリには、そのアプリケーション内の Realm に含まれる可能性のある各オブジェクト タイプのオブジェクト スキーマのリストで構成されるRealm スキーマがあります。
Realm は、Realm 内のすべてのオブジェクトがオブジェクトタイプのスキーマに準拠していることを保証し、オブジェクトが作成、変更、または削除されるたびにオブジェクトを検証します。
Atlas Device Sync を使用するアプリは、次の 2 つの方法でスキーマを定義できます。
アプリ バックエンド内の JSONオブジェクト スキーマ。
関係
RealmObject フィールドを使用して、Realm 内 の 1 対 1 の 関係をモデル化できます。RealmList フィールドでは、1 対多 および多対 1 の 関係をモデル化できます。逆の関係とは、 1対多または多対 1の関係の反対側にあります。 RealmResults フィールドの @LinkingObjects 注釈を使用して、 逆 関係を走査可能にします。RealmObject
のインスタンスでは、逆関係フィールドには、説明された関係を通じてそのオブジェクト インスタンスを指す Realm オブジェクトのセットが含まれます。 手動クエリで同じ Realm オブジェクトのセットを見つけることはできますが、逆関係フィールドによりクエリ コードとエラー容量が削減されます。
Realm オブジェクト
独自のデータを含む通常の Java オブジェクトとは異なり、Realm オブジェクトにはデータは含まれません。 代わりに、Realm オブジェクトは読み取りと書込みのプロパティを Realm に直接表示します。
Realm オブジェクトのインスタンスは、管理対象と非管理のいずれかになります 。
管理対象オブジェクトは次のとおりです。
Realm で保存された
常に最新の状態
スレッドのみ
Java ヒープで占有するスペースが少なくなるため、通常は管理されていないバージョンよりも軽量です。
非管理オブジェクトは、永続化されず、自動的に更新されないため、通常の Java オブジェクトと同様です。 管理されていないオブジェクトはスレッド間で自由に移動できます。
Realm. copyToRealm()を使用して 2 つの状態間で変換できます およびRealm. copyFromRealm() 。
RealmProxy
RealmProxy
クラスは、Realm オブジェクト自体にデータが含まれないようにする Realm SDK の方法です。 代わりに、各クラスのRealmProxy
はデータベース内のデータに直接アクセスします。
プロジェクト内のすべてのモデル クラスに対して、Realm 注釈プロセッサは対応するRealmProxy
クラスを生成します。 このクラスはモデル クラスを拡張し、 Realm.createObject()
を呼び出すと返されます。 コード内では、このオブジェクトはモデル クラスと同様に機能します。
Realm オブジェクトの制限
Realm オブジェクト:
には、
final
またはvolatile
修飾子を使用するフィールドを含めることはできません(逆関係フィールドを除く)。は、
RealmObject
以外のオブジェクトを拡張できません。には空のコンストラクターが含まれている必要があります(クラスにコンストラクターが含まれていない場合は、自動生成される空のコンストラクターで十分です)
命名制限があります。
クラス名は 57 文字を超えることはできません。
クラス名はRealm モジュール内で一意である必要があります
フィールド名は 63 文字を超えることはできません。
サイズ制限:
String
またはbyte[]
フィールドは 16 MB を超えることはできません。
使用上の制限:
Realm オブジェクトはライブであり、いつでも変化する可能性があるため、その
hashCode()
値は時間の経過とともに変化する可能性があります。 そのため、マップまたはセットのキーとしてRealmObject
インスタンスを使用しないでください。
増分ビルド
Realmで使用されるバイトコード トランスレーターは増分ビルドをサポートしていますが、アプリケーションは Realm オブジェクト フィールドから以下を追加または削除するときに完全な再構築を必要とします。
@Ignore
注釈static
キーワードtransient
キーワード
このような場合は、 Build > Clean ProjectとBuild > Rebuild Projectを使用して完全な再ビルドを実行できます。
スキーマ バージョン
スキーマ バージョンは、ある時点におけるRealm スキーマの状態を識別します。 Realm は各 Realm のスキーマ バージョンを追跡し、それを使用して各 Realm 内のオブジェクトを正しいスキーマにマッピングします。
スキーマ バージョンは、Realm を開くときに Realm 構成に含めることができる整数です。 クライアント アプリケーションが Realm を開くときにバージョン番号を指定しない場合、Realm はデフォルトでバージョン0
になります。
重要
バージョンを単調に増加させる
移行によって、Realm をより高いスキーマ バージョンに更新する必要があります。 Realm は、Realm の現在のバージョンよりも低いスキーマ バージョンでクライアント アプリケーションが Realm を開き、または指定されたスキーマ バージョンが Realm の現在のバージョンと同じであるが、異なるオブジェクト スキーマを含む場合にエラーをスローします。
移行
ローカル移行とは、別の Realm と自動的に同期しない Realm の移行です。 ローカル移行では、既存の Realm スキーマ、バージョン、およびオブジェクトにアクセスでき、Realm を新しいスキーマ バージョンに段階的に更新するロジックを定義します。 ローカル移行を実行するには、現在のバージョンよりも高い新しいスキーマ バージョンを指定し、古くなった Realm を開くときに移行機能を提供する必要があります。
SDK を使用すると、手動移行を使用してスキーマの変更を反映するように基礎となるデータを更新できます。 このような手動移行中に、スキーマに追加または削除されるときに、新しいプロパティと削除されたプロパティを定義できます。 DinanceRealm経由で公開される編集可能なスキーマは、フィールドの名前を変更するための便利な機能を提供します。 これにより、複雑なスキーマ移行中にデータの動作を完全に制御できます。
Tip
アプリケーション開発中の移行
アプリケーションの開発中に、 RealmObject
クラスは頻繁に変更される可能性があります。 Realm.deleteRealm()を使用してデータベース ファイルを削除すると、テスト データをテストするための完全な移行を作成する必要がなくなります。