プロパティ注釈 - Kotlin SDK
このページでは、オブジェクトモデル内のプロパティの動作をカスタマイズするために使用できる注釈について説明します。 オブジェクトモデルを定義する方法の詳細については、「 Realm オブジェクトモデルの定義 - Kotlin SDK 」を参照してください。
Kotlin SDK は、Realm オブジェクト プロパティに機能を追加するいくつかのプロパティ注釈を提供します。 Refer also to the Annotations API reference.
注意
プロパティ宣言
Kotlin では、値の型は暗黙的に null 以外の値になります。 組み込みの?
Kotlin 演算子を使用して、プロパティは任意(null 可能)を宣言できます。 または、プロパティ宣言でプロパティにデフォルト値を割り当てることもできます。 例については、「サポートされているデータ型リスト 」を参照してください。
このページの例えでは、次のFrog
クラスを参照します。
class Frog : RealmObject { var _id: ObjectId = ObjectId() // Primary key property var name: String = "" // Indexed property var age: Int = 0 // Ignored property var species: String? = null // Remapped property var physicalDescription: String? = null // Full-text search indexed property }
プライマリキーの指定
プライマリキーは、Realm 内のオブジェクトの一意の識別子です。 同じタイプの他のオブジェクトは、オブジェクトのプライマリキーを共有できません。
オブジェクトタイプのプライマリキーとしてプロパティを指定するには、 @PrimaryKey注釈を使用します。
var _id: ObjectId = ObjectId() // Primary key property
プライマリキーの重要な要素:
オブジェクト スキーマごとに定義できるプライマリキーは 1 つだけです。
オブジェクトタイプのプライマリキー フィールドは、そのタイプのオブジェクトを Realm に追加した後では、変更できません。
プライマリキー値は、Realm 内のオブジェクトのすべてのインスタンスで一意である必要があります。 重複するプライマリキー値を挿入しようとすると、エラーが発生します。
プライマリキーの値は不変です。 オブジェクトのプライマリキー値を変更するには、元のオブジェクトを削除し、別のプライマリキー値を持つ新しいオブジェクトを挿入する必要があります。
プライマリキーは null 可能です。 プライマリキー値は一意である必要があるため、
null
はコレクション内の 1 つのオブジェクトのプライマリキーになることができます。Realm はプライマリキーを自動的にインデックス化するため、プライマリキーに基づいてオブジェクトを効率的に読み取り、変更できます。
次のいずれかのタイプのプライマリキーを作成できます。
String
Byte
Char
Short
Int
Long
ObjectId
RealmUUID
重要
Device Sync には _id プライマリキー フィールドが必要です
Device Sync を使用する場合、オブジェクトモデルには_id
という名前のプライマリキー フィールドが含まれている必要があり、これは
String
、 Int
、またはObjectId
のいずれかである必要があります。
プロパティまたはクラスを別の名前にマッピング
バージョン 10.8.0 の新機能: @PersistedName でクラス名を再マッピングします
デフォルトでは、Realm はモデル クラスで定義された名前を使用して、クラスとフィールドを内部的に表します。 Kotlin SDK を使用すると、プロパティ名またはクラス名を、コードで使用される名前とは異なる永続名にマッピングできます。 Realm に別の名前を保持すると便利な場合があります。次のような場合です。
命名規則が異なるプラットフォーム間での操作を容易にします。 たとえば、Device Sync スキーマのプロパティ名がスニペットのケースを使用する場合、プロジェクトはキャメルケースを使用します。
異なるパッケージで同じ単純名を持つ複数のモデル クラスをサポートします。
Realm によって強制される 57 文字の制限よりも長いクラス名を使用します。
コード内の Kotlin クラスまたはプロパティ名を、Realm に永続化する別の名前にマッピングするには、次の手順に従います。
Kotlin クラスまたはプロパティで@PersistedNameアノテーションを使用します。
Realm に永続化するクラスまたはプロパティ
name
を指定します。
この例では、 Frog
は CRUD 操作を実行するためにプロジェクト全体のコードで使用される Kotlin クラス名であり、 Frog_Entity
は Realm にオブジェクトを保存するために使用される永続名です。
// Remapped class name class Frog : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" var age: Int = 0 var species: String? = null var owner: String? = null }
重要
再マッピングされたクラス名によるクエリ
再マッピングされたクラス名を持つオブジェクトで逆の関係をクエリする場合は、永続化されたクラス名を使用する必要があります。 上記の例では、Frog_Entity
Frog
ではなく をクエリする必要があります。詳しくは、「クエリの逆関係 」を参照してください。
この例では、 species
は CRUD 操作を実行するためにプロジェクト全体のコードで使用される Kotlin プロパティ名であり、 latin_name
は Realm に値を保存するために使用される永続名です。
var species: String? = null // Remapped property
Tip
再マッピングされたプロパティ名によるクエリ
コードで使用される Kotlin 名と、Realm に保存されている永続的な名前の両方でクエリを実行できます。 詳しくは、 :ref:``
同期された Realm に書き込むと、Sync スキーマは永続化されたクラスまたはプロパティ名を使用して保存された値を確認します。 次の点に注意してください。
移行では、永続化されたクラスまたはプロパティ名を使用する必要があります。
報告されたスキーマ エラーでは、永続化された名前が使用されます。
Realm スキーマからのプロパティの無視
デフォルトでは、Realm は Realm オブジェクトモデルで定義されたプロパティを管理します。 ただし、Realm に保持したくないプロパティを無視することもできます。
プロパティを無視して、そのプロパティが Realm に保持されないようにするには、 @Ignoreアノテーションを使用します。
var age: Int = 0 // Ignored property
無視されたプロパティは、データベースに保存されないこと、クエリで使用できないこと、およびtriggerRealm 通知が されないことを除いて、管理対象プロパティと完全に同様に動作します。クラス内で管理対象プロパティと無視されているプロパティを混在させることができます。
インデックスのプロパティ
インデックスは、Realm のデータのごく一部を簡単に走査できる形式で保存する特別なデータ構造です。 インデックスは、Realm 内でより効率的なクエリの実行をサポートします。 クエリに適切なインデックスがある場合、Realm ではそのインデックスを使用して検査する必要があるドキュメントの数が制限されます。 それ以外の場合、Realm はコレクション内のすべてのドキュメントをスキャンし、クエリに一致するドキュメントを選択する必要があります。
インデックスには、特定のフィールドの値が、フィールド値の順に保存されます。 インデックス エントリの順序付けは、効率的な等価一致と範囲ベースのクエリ操作をサポートします。 インデックスにより一部のクエリは高速化されますが、書込みは若干遅くなります。 追加のストレージとメモリのオーバーヘッドが伴います。 Realm はインデックスをディスクに保存するため、Realm ファイルが大きくなります。 各インデックスエントリは 12 バイト以上です。
プロパティにインデックスを作成するには、プロパティで@Indexアノテーションを使用します。
var name: String = "" // Indexed property
注意
プライマリキーはデフォルトでインデックス付けされます。
次のタイプのフィールドをインデックスできます。
String
Byte
Short
Int
Long
Boolean
RealmInstant
ObjectId
RealmUUID
同じプロパティで、標準インデックスと全文検索(FTS)インデックスを組み合わせることはできません。 プロパティに FTS インデックスを作成するには、 「 全文検索インデックス 」セクションを参照してください。
全文検索インデックス
標準インデックスに加えて、Realm はString
プロパティで全文検索(FTS)インデックスもサポートしています。 標準インデックスの有無にかかわらず string フィールドをクエリできますが、FTS インデックスを使用すると複数の単語とフレーズを検索し、その他を除外できます。
プロパティに FTS インデックスを作成するには、 @FullTextアノテーションを使用します。
var physicalDescription: String? = null // Full-text search indexed property
FTS インデックスの次の制約に注意してください。
FTS インデックスは、
String
タイプのプロパティでのみ作成できます。同じプロパティで FTS インデックスと標準インデックスを組み合わせることはできません。 プロパティに標準インデックスを作成するには、「インデックス プロパティ」セクションを参照してください。
注意
全文検索インデックスの文字制限
全文検索(FTS) インデックスの場合、インデックスには ASCII および Atlas 1 の英数字文字(ほとんどの西部言語)のみがインデックスに含まれます。
インデックスは、発音区別符号を区別せず、大文字と小文字を区別しません。
全文インデックスのクエリの詳細については、 「 全文検索でフィルタリング(FTS)プロパティ 」を参照してください。