Docs Menu
Docs Home
/ /
モデルデータ

サポートされているタイプ - Kotlin SDK

このページでは、オブジェクト モデルでプロパティを定義するために使用できるサポートされているデータ型について説明します。 オブジェクトモデルを定義する方法の詳細については、「 オブジェクトモデルの定義 」を参照してください。

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 データ型
必須
任意

String

var stringReq: String = ""
var stringOpt: String? = null

Byte

var byteReq: Byte = 0
var byteOpt: Byte? = null

Short

var shortReq: Short = 0
var shortOpt: Short? = null

Int

var intReq: Int = 0
var intOpt: Int? = null

Long

var longReq: Long = 0L
var longOpt: Long? = null

Float

var floatReq: Float = 0.0f
var floatOpt: Float? = null

Double

var doubleReq: Double = 0.0
var doubleOpt: Double? = null

Boolean

var boolReq: Boolean = false
var boolOpt: Boolean? = null

Char

var charReq: Char = 'a'
var charOpt: Char? = null

MongoDB BSON types

次の表は、サポートされているMongoDB BSONデータ型と、オブジェクトモデルでそれらを必須またはオプション プロパティとして宣言する方法の例を示しています。これらのタイプを使用するには、 org.mongodb.kbson パッケージからインポートする必要があります。

MongoDB BSON Type
必須
任意
var objectIdReq: ObjectId = ObjectId()
var objectIdOpt: ObjectId? = null

Decimal128

var decimal128Req: Decimal128 = Decimal128("123.456")
var decimal128Opt: Decimal128? = null

Realm 固有のタイプ

次の表は、サポートされている Realm 固有のデータ型と、オブジェクトモデルでそれらを必須またはオプションのプロパティとして宣言する方法の例を示しています。

Realm 固有のタイプ
必須
任意
var uuidReq: RealmUUID = RealmUUID.random()
var uuidOpt: RealmUUID? = null
var realmInstantReq: RealmInstant = RealmInstant.now()
var realmInstantOpt: RealmInstant? = null

該当なし

var realmAnyOpt: RealmAny? = RealmAny.create("foo")
var mutableRealmIntReq: MutableRealmInt = MutableRealmInt.create(0)
var mutableRealmIntOpt: MutableRealmInt? = null
var listReq: RealmList<CustomObjectType> = realmListOf()

該当なし

var setReq: RealmSet<String> = realmSetOf()

該当なし

var dictionaryReq: RealmDictionary<String> = realmDictionaryOf()

該当なし

該当なし

var realmObjectPropertyOpt: CustomObjectType? = null

該当なし

var embeddedProperty: EmbeddedObjectType? = null

Kotlin SDK は、 ObjectIdRealmオブジェクトの一意の識別子として UUID と をサポートしています。

注意

ObjectId の代わりに UUID を使用する

一般的に、一意の識別子として機能するフィールドにはUUIDを使用できます。 MongoDB に保存されていないデータを移行する場合、オブジェクトの一意の識別子がすでにUUIDタイプになっている可能性があるため、 UUIDを使用すると特に便利です。 あるいは、MongoDB にすでに存在するデータのコレクションには、 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 をインポートする必要があります。

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()

Kotlin SDK は、複数の分散クライアント間で数値の変更を正確に同期するための論理カウンターとして使用できる特殊な整数型として MutableRealmInt を提供します。Longincrement動作はdecrement と似ていますが、 競合のない複製データ型を実装する メソッドと メソッドもサポートしています。これにより、同じ値に変換する順序に関係なく、数値更新を実行できるようになります。

MutableRealmIntプロパティ:

  • プライマリキー として使用 できません

  • は null 値を保存できませんが、null 可能であると宣言できます( MutableRealmInt?

さらに、 MutableRealmIntフィールドは次の操作を行います。

  • は Kotlin の数値型によってサポートされているため、数値フィールドを MutableRealmInt に変更するときに移行は必要ありません。

  • は、 Longが提供するものと同様の演算子とインデックス関数を使用できます。 ただし、 setincrementdecrement以外の操作では、操作が実行されるインスタンスがミューテーションされないことに注意してください。 代わりに、更新された 値を持つ新しい非マネージドMutableRealmIntインスタンスを作成します。

MutableRealmInt(counter)プロパティの作成方法と MutableRealmInt(counter)プロパティ更新する方法を学びます。

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)
}
}

バージョン2.0.0での変更: RealmAnyは混合データのリストと辞書を保持できます。

RealmAnyは null 以外の混合データ型を表します。 値の型と同様に動作します。 RealmAnyは以下を保持できます。

  • サポートされている Kotlin データ型ByteCharIntLongShortの値は内部的にint64_t値に変換されることに注意してください)

  • サポートされている BSON types

  • RealmList 混合データの とRealmDictionaryコレクション

  • 次の Realm 固有のタイプ。

    • Realmインスタンス

    • RealmUUID

    • RealmObject (オブジェクトのコピーではなく、オブジェクトへの参照を保持)

RealmAny は、 EmbeddedRealmObject型、 RealmSet 、または別のRealmAnyを保持できません

RealmAny properties

複数のRealmAnyインスタンスをRealmListRealmDictionary 、またはRealmSetフィールドに保存できます。

Tip

条件式による多形データの処理

その値を抽出するには、保存された型を知っている必要があるため、 RealmAny型とその可能な内部値クラスを処理するにはwhen式を使用することをお勧めします。

バージョン2.0.0以降では、 RealmAnyデータ型にRealmAny要素のコレクション(リストまたは辞書であるが、セットではない)を保持できます。 混合コレクションを使用して、非構造化データまたは変数データをモデル化できます。 詳細については、「非構造化データの定義 」を参照してください。

  • 混合コレクションは最大100レベルまでネストできます。

  • 通常のコレクションと同様に、混合コレクション プロパティをクエリし、 変更のリスナーを登録できます。

  • 混合コレクション要素を個別に検索して更新できます

  • セットまたは埋め込みオブジェクトを混合コレクションに保存することはできません

アプリで混合コレクションを使用するには、他のRealmAny型と同様に、データモデル内で混合型プロパティを定義します。 次に、 RealmAny.create()を使用してリストまたは辞書コレクションを作成します。

Kotlin SDK は、データモデルのプロパティとして使用できるいくつかのコレクション タイプを提供します。 コレクションは、サポートされている 1 つのデータ型の 0 個以上のインスタンスを含むオブジェクトです。 Realm コレクションは同種(コレクション内のすべてのオブジェクトは同じタイプ)であり、対応する組み込み Kotlin クラスによってサポートされています。

コレクション タイプは null 以外です。 コレクション プロパティを定義するときは、それを初期化する必要があります。 詳細については、「 コレクションの作成 」を参照してください。

RealmList 型は Kotlin の List インターフェースを実装します。管理されていないリストは、 Kotlin のMutableListと同様に動作します。

RealmListは、次の要素を含む対多の関係を表します。

RealmList<E> は、null 以外の型であり、

  • RealmObjectまたはEmbeddedRealmObject要素のリストは null にならない

  • サポートされている他の要素のリストは null 可能です( RealmList<E?>

RealmSet 型は Kotlin の Set インターフェースを実装します。管理されていないセットは、 Kotlin のMutableSetのように動作します。

RealmSetは、次の個別の値を含む対多の関係を表します。

RealmSetではEmbeddedRealmObject要素は使用できません。

RealmSet<E> は、null 以外の型であり、

  • RealmObject要素のセットは null にできませ

  • サポートされている他の要素のセットは null 可能です( RealmSet<E?>

RealmMap 型は Kotlin の Map インターフェースを実装し、一意のキーを持つキーと値の String ペアを含む連想配列です。RealmDictionary は、Stringキーと文字列以外の値を受け入れる専用の RealmMap です。管理されていない辞書は、 Kotlin のLinkedHashMapのように動作します。

RealmDictionary 値は次のとおりです。

RealmDictionary<K, V> は、null 以外の型であり、

  • キーは string である必要があります

  • RealmObject またはEmbeddedRealmObject値は null 可能である必要があります( RealmDictionary<K, V?>

  • サポートされている他の要素値は null にすることができます

オブジェクトモデルのプロパティとして、 RealmObjectと任意のサブクラスを使用できます( AsymmetricRealmObjectを除く)。

重要

AsymmetricRealmObject は、プロパティとして使用することはできません。 詳細については、「非対称オブジェクト 」を参照してください。

RealmObject型は、プロパティとして使用できるカスタム オブジェクトを表します。

RealmObject properties

  • は null 可能と宣言する必要があります

  • はコレクションの要素として使用できます

  • RealmAny値として保持できます

  • プライマリキー として使用 できません

また、別のものから 1 つ以上の Realm オブジェクトを参照することもできます。 詳細については、「関係」ページを参照してください。

バックリンク は、 RealmObjectと 1 つ以上のRealmObjectまたはRealmObjectEmbeddedRealmObjectの間の、逆 対多の関係を表します。 バックリンクは null にすることはできません。

バックリンクの実装:

詳細については、 「 逆の関係 」を参照してください。

埋め込み RealmObjectRealmObjectの特殊な型です。

EmbeddedRealmObject properties

  • は、親オブジェクト内の null 可能なオブジェクトである必要があります

  • は、辞書内の null 可能な値である必要があります

  • は、リスト内の null 可能な要素であることはできません

  • プライマリキー として使用 できません

  • 非対称オブジェクト内のプロパティである可能性があります

詳細については、「埋め込みオブジェクト 」を参照してください。

バージョン 1.11.0 の新機能

Kotlin SDK は、次のデータ型を使用する地理空間クエリをサポートしています。

重要

地理空間データ型を永続化できません

現在、地理空間データ型を永続化することはできません。 たとえば、タイプGeoBoxのプロパティを宣言することはできません。

これらの型は、地理空間クエリの引数としてのみ使用できます。

地理空間データを使用したクエリの詳細については、「 地理空間データ 」を参照してください

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
}
}

戻る

オブジェクトモデルを定義する