このページでは、オブジェクト モデルでプロパティを定義するために使用できるサポートされているデータ型について説明します。 オブジェクトモデルを定義する方法の詳細については、「 オブジェクトモデルの定義 」を参照してください。
App Services スキーマで特定のデータ型が にマッピングされる方法については、 ドキュメントの「BSON types データモデル マッピング Atlas App Services」 を参照してください。
サポートされているデータ型リスト
Kotlin SDK は、次のKotlin型 、 BSON型、Realm 固有の型をサポートしており、一意の識別子、タイムスタンプ、カウンター、コレクションに使用できます。
Kotlin SDK は次のネイティブ サポートをサポートしていません。
ユーザー定義の列挙プロパティ。 Realm オブジェクトで列挙を使用する方法の詳細については、「列挙 」セクションを参照してください。
Kotlin の組み込み
DateまたはInstant。 Realm オブジェクトでタイムスタンプを使用する方法の詳細については、「 Realmインスタンス 」セクションを参照してください。
Realm オブジェクトのプロパティは、宣言時に可変で初期化されている必要があります。 Kotlin SDK は現在、抽象プロパティをサポートしていません。 組み込みの? Kotlin 演算子を使用して、プロパティは任意(nullable)であるか、プロパティが宣言するときにプロパティにデフォルト値を割り当てることができます。
注意
Realm では、10 進数以外の数値型はすべてLong値として、すべての 10 進数数値型はDouble値として保存されます。
Kotlin データ型
次の表は、サポートされている Kotlin データ型と、オブジェクトモデルでそれらを必須またはオプションのプロパティとして宣言する方法の例を示しています。
Kotlin データ型 | 必須 | 任意 | ||
|---|---|---|---|---|
| | | ||
| | | ||
| | | ||
| | | ||
| | | ||
| | | ||
| | | ||
| | | ||
| | |
MongoDB BSON types
次の表は、サポートされているMongoDB BSONデータ型と、オブジェクトモデルでそれらを必須またはオプション プロパティとして宣言する方法の例を示しています。これらのタイプを使用するには、 org.mongodb.kbson パッケージからインポートする必要があります。
MongoDB BSON Type | 必須 | 任意 | ||
|---|---|---|---|---|
| | |||
| | |
Realm 固有のタイプ
次の表は、サポートされている Realm 固有のデータ型と、オブジェクトモデルでそれらを必須またはオプションのプロパティとして宣言する方法の例を示しています。
Realm 固有のタイプ | 必須 | 任意 | ||
|---|---|---|---|---|
| | |||
| | |||
該当なし | | |||
| | |||
| 該当なし | |||
| 該当なし | |||
| 該当なし | |||
該当なし | | |||
該当なし | |
Unique Identifiers
Kotlin SDK は、 ObjectIdRealmオブジェクトの一意の識別子として UUID と をサポートしています。
注意
ObjectId の代わりに UUID を使用する
一般的に、一意の識別子として機能するフィールドにはUUIDを使用できます。 MongoDB に保存されていないデータを移行する場合、オブジェクトの一意の識別子がすでにUUIDタイプになっている可能性があるため、 UUIDを使用すると特に便利です。 あるいは、MongoDB にすでに存在するデータのコレクションには、 ObjectIdを使用すると便利な場合があります。
ObjectId
ObjectId は、MongoDB 固有の BSON type です。 これは 12 バイトのグローバル一意な値で、オブジェクトの識別子として使用できます。 これは null 可能で、インデックスが可能 で、プライマリキーとして使用できます。
ObjectIdObjectId()を使用して を初期化できます。
重要
io.realm.kotlin.types.ObjectId v1.5.0 では非推奨
Realm Kotlin SDKバージョン1.5.0 以降では、io. .kotlin.types.ObjectIdは非推奨です。代わりに、org.mongodb.kbson.ObjectId から ObjectId をインポートする必要があります。
RealmUUID
UUID (汎用一意識別子)は 16 バイトの一意の値で、オブジェクトの識別子として使用できます。 これは null 可能で、インデックスが可能 で、プライマリキーとして使用できます。
Realm は、RFC4122 バージョン4 に準拠し、ランダムなバイトで作成された RealmUUID タイプで UUID を作成します。
RealmUUID.readm()を使用してランダムなRealmUUIDを生成できます または UUID 形式のstringをRealmUUID.from()に渡すと、次のようになります。
val uuid1 = RealmUUID.from("46423f1b-ce3e-4a7e-812f-004cf9c42d76") val uuid2 = RealmUUID.random()
MutableRealmInt(counter)
Kotlin SDK は、複数の分散クライアント間で数値の変更を正確に同期するための論理カウンターとして使用できる特殊な整数型として MutableRealmInt を提供します。Longincrement動作はdecrement と似ていますが、 競合のない複製データ型を実装する メソッドと メソッドもサポートしています。これにより、同じ値に変換する順序に関係なく、数値更新を実行できるようになります。
MutableRealmIntプロパティ:
は プライマリキー として使用 できません
は null 値を保存できませんが、null 可能であると宣言できます(
MutableRealmInt?)
さらに、 MutableRealmIntフィールドは次の操作を行います。
は Kotlin の数値型によってサポートされているため、数値フィールドを
MutableRealmIntに変更するときに移行は必要ありません。は、
Longが提供するものと同様の演算子とインデックス関数を使用できます。 ただし、set、increment、decrement以外の操作では、操作が実行されるインスタンスがミューテーションされないことに注意してください。 代わりに、更新された 値を持つ新しい非マネージドMutableRealmIntインスタンスを作成します。
MutableRealmInt(counter)プロパティの作成方法と MutableRealmInt(counter)プロパティを更新する方法を学びます。
Realmインスタンス(タイムスタンプ)
Kotlin の組み込みDateまたはInstant型は Realm では保存できません。
代わりに、 Kotlin SDK はRealmインスタンス 型を使用して時間情報を UNIXエポック タイムスタンプ として保存します。
RealmInstant以外の形式のタイムスタンプ データが必要な場合は、次の例に基づいてモデル クラスに変換コードを追加できます。
// model class that stores an Instant (kotlinx-datetime) field as a RealmInstant via a conversion class RealmInstantConversion : RealmObject { private var _timestamp: RealmInstant = RealmInstant.from(0, 0) public var timestamp: Instant get() { return _timestamp.toInstant() } set(value) { _timestamp = value.toRealmInstant() } } fun RealmInstant.toInstant(): Instant { val sec: Long = this.epochSeconds // The value always lies in the range `-999_999_999..999_999_999`. // minus for timestamps before epoch, positive for after val nano: Int = this.nanosecondsOfSecond return if (sec >= 0) { // For positive timestamps, conversion can happen directly Instant.fromEpochSeconds(sec, nano.toLong()) } else { // For negative timestamps, RealmInstant starts from the higher value with negative // nanoseconds, while Instant starts from the lower value with positive nanoseconds // TODO This probably breaks at edge cases like MIN/MAX Instant.fromEpochSeconds(sec - 1, 1_000_000 + nano.toLong()) } } fun Instant.toRealmInstant(): RealmInstant { val sec: Long = this.epochSeconds // The value is always positive and lies in the range `0..999_999_999`. val nano: Int = this.nanosecondsOfSecond return if (sec >= 0) { // For positive timestamps, conversion can happen directly RealmInstant.from(sec, nano) } else { // For negative timestamps, RealmInstant starts from the higher value with negative // nanoseconds, while Instant starts from the lower value with positive nanoseconds // TODO This probably breaks at edge cases like MIN/MAX RealmInstant.from(sec + 1, -1_000_000 + nano) } }
RealmAny(混合)
バージョン2.0.0での変更: RealmAnyは混合データのリストと辞書を保持できます。
RealmAnyは null 以外の混合データ型を表します。 値の型と同様に動作します。 RealmAnyは以下を保持できます。
サポートされている Kotlin データ型(
Byte、Char、Int、Long、Shortの値は内部的にint64_t値に変換されることに注意してください)RealmList混合データの とRealmDictionaryコレクション次の Realm 固有のタイプ。
Realmインスタンス
RealmUUID
RealmObject (オブジェクトのコピーではなく、オブジェクトへの参照を保持)
RealmAny は、 EmbeddedRealmObject型、 RealmSet 、または別のRealmAnyを保持できません。
RealmAny properties
は null 可能(
RealmAny?)である必要がありますが、null 値は保存できませんは RealmQuery.max で 集計 できます 、RealmQuery.min 、およびRealmQuery.sum
はソートできます 。 最高から最低の順にソートします。
BooleanByte,Double,Decimal128,Int,Float,Long,Shortbyte[],StringDateObjectIdUUIDRealmObject
複数のRealmAnyインスタンスをRealmList 、 RealmDictionary 、またはRealmSetフィールドに保存できます。
Tip
条件式による多形データの処理
その値を抽出するには、保存された型を知っている必要があるため、 RealmAny型とその可能な内部値クラスを処理するにはwhen式を使用することをお勧めします。
混合としてのコレクション
バージョン2.0.0以降では、 RealmAnyデータ型にRealmAny要素のコレクション(リストまたは辞書であるが、セットではない)を保持できます。 混合コレクションを使用して、非構造化データまたは変数データをモデル化できます。 詳細については、「非構造化データの定義 」を参照してください。
混合コレクションは最大100レベルまでネストできます。
通常のコレクションと同様に、混合コレクション プロパティをクエリし、 変更のリスナーを登録できます。
混合コレクション要素を個別に検索して更新できます
セットまたは埋め込みオブジェクトを混合コレクションに保存することはできません。
アプリで混合コレクションを使用するには、他のRealmAny型と同様に、データモデル内で混合型プロパティを定義します。 次に、 RealmAny.create()を使用してリストまたは辞書コレクションを作成します。
コレクションのタイプ
Kotlin SDK は、データモデルのプロパティとして使用できるいくつかのコレクション タイプを提供します。 コレクションは、サポートされている 1 つのデータ型の 0 個以上のインスタンスを含むオブジェクトです。 Realm コレクションは同種(コレクション内のすべてのオブジェクトは同じタイプ)であり、対応する組み込み Kotlin クラスによってサポートされています。
コレクション タイプは null 以外です。 コレクション プロパティを定義するときは、それを初期化する必要があります。 詳細については、「 コレクションの作成 」を参照してください。
RealmList
RealmList 型は Kotlin の List インターフェースを実装します。管理されていないリストは、 Kotlin のMutableListと同様に動作します。
RealmListは、次の要素を含む対多の関係を表します。
RealmList<E> は、null 以外の型であり、
RealmObjectまたはEmbeddedRealmObject要素のリストは null にならないサポートされている他の要素のリストは null 可能です(
RealmList<E?>)
RealmSet
RealmSet 型は Kotlin の Set インターフェースを実装します。管理されていないセットは、 Kotlin のMutableSetのように動作します。
RealmSetは、次の個別の値を含む対多の関係を表します。
RealmSetではEmbeddedRealmObject要素は使用できません。
RealmSet<E> は、null 以外の型であり、
RealmObject要素のセットは null にできませんサポートされている他の要素のセットは null 可能です(
RealmSet<E?>)
RealmMap/RealmDictionary
RealmMap 型は Kotlin の Map インターフェースを実装し、一意のキーを持つキーと値の String ペアを含む連想配列です。RealmDictionary は、Stringキーと文字列以外の値を受け入れる専用の RealmMap です。管理されていない辞書は、 Kotlin のLinkedHashMapのように動作します。
RealmDictionary 値は次のとおりです。
RealmDictionary<K, V> は、null 以外の型であり、
キーは string である必要があります
RealmObjectまたはEmbeddedRealmObject値は null 可能である必要があります(RealmDictionary<K, V?>)サポートされている他の要素値は null にすることができます
プロパティとしての RealmObjects
オブジェクトモデルのプロパティとして、 RealmObjectと任意のサブクラスを使用できます( AsymmetricRealmObjectを除く)。
重要
AsymmetricRealmObject は、プロパティとして使用することはできません。 詳細については、「非対称オブジェクト 」を参照してください。
RealmObjects
RealmObject型は、プロパティとして使用できるカスタム オブジェクトを表します。
RealmObject properties
は null 可能と宣言する必要があります
はコレクションの要素として使用できます
は
RealmAny値として保持できますは プライマリキー として使用 できません
また、別のものから 1 つ以上の Realm オブジェクトを参照することもできます。 詳細については、「関係」ページを参照してください。
バックリンク
バックリンク は、 RealmObjectと 1 つ以上のRealmObjectまたはRealmObjectとEmbeddedRealmObjectの間の、逆 対多の関係を表します。 バックリンクは null にすることはできません。
バックリンクの実装:
RealmObjectバックリンクの バックリンク削除型EmbeddedRealmObjectバックリンクの埋め込みBacklinksDelete型
詳細については、 「 逆の関係 」を参照してください。
埋め込みRealmObject
埋め込み RealmObjectはRealmObjectの特殊な型です。
EmbeddedRealmObject properties
は、親オブジェクト内の null 可能なオブジェクトである必要があります
は、辞書内の null 可能な値である必要があります
は、リスト内の null 可能な要素であることはできません
は プライマリキー として使用 できません
非対称オブジェクト内のプロパティである可能性があります
詳細については、「埋め込みオブジェクト 」を参照してください。
地理空間タイプ
バージョン 1.11.0 の新機能。
Kotlin SDK は、次のデータ型を使用する地理空間クエリをサポートしています。
重要
地理空間データ型を永続化できません
現在、地理空間データ型を永続化することはできません。 たとえば、タイプGeoBoxのプロパティを宣言することはできません。
これらの型は、地理空間クエリの引数としてのみ使用できます。
地理空間データを使用したクエリの詳細については、「 地理空間データ 」を参照してください。
Enums
Kotlin SDK は列挙型、または 列挙型をネイティブでサポートしていません。 Realm オブジェクト クラスで列挙型を使用するには、列挙型の基になるデータ型と一致する型のフィールドを定義します。
次に、基礎となる値と列挙型の間でフィールド値を変換するフィールドのゲッターとセッターを作成します。
enum class EnumClass(var state: String) { NOT_STARTED("NOT_STARTED"), IN_PROGRESS("IN_PROGRESS"), COMPLETE("COMPLETE") } class EnumObject : RealmObject { var name: String? = null private var state: String = EnumClass.NOT_STARTED.state var stateEnum: EnumClass get() = EnumClass.valueOf(state) set(value) { state = value.state } }