Realm オブジェクト スキーマの定義 - Flutter SDK
項目一覧
重要
Flutter SDK v 2.0.0 生成されたファイルへの重大な変更
Flutter SDK バージョン2.0.0 はビルダにアップデートを導入し、ファイルの生成方法に影響を与えます。 v 2.0.0以降では、生成されたすべてのファイルで、 .g.dart
ではなく .realm.dart
の命名規則が使用されます。
これは既存のアプリにとって重大な変更です。 既存のアプリを以前の SDK バージョンから v 2.0.0以降にアップグレードする方法については、「 Flutter SDK v 2.0.0へのアップグレード 」を参照してください。
オブジェクト スキーマは、Realm オブジェクトのプロパティと関係を定義する構成オブジェクトです。 Realm クライアント アプリケーションは、 オブジェクト スキーマを使用して、それぞれの言語のネイティブ クラス実装でオブジェクト スキーマを定義します。
オブジェクト スキーマは、各プロパティのデータ型やプロパティが必要かどうかなど、オブジェクト プロパティに関する制約を指定します。 スキーマは、Realm 内のオブジェクトタイプ間の関係を定義することもできます。
モデルの作成
RealmModel の作成
Realmスキーマのモデルを作成します。注釈を含める必要があります RealmModel クラス定義の上部にある。
ステップ 4 のアプリケーション全体で使用される公開RealmObject
を生成するには、 RealmModel
を使用します。
モデルをプライベートまたはパブリックにすることができます。 すべてのモデルをプライベート化し、単一のファイルで定義することをお勧めします。 クラス名の前にアンダースコア( _
)を付けて、プライベートクラスにします。
複数のファイルにわたってスキーマを定義する必要がある場合は、RealmModel をパブリックにすることができます。 モデルを公開するには、名前の前にドル記号( $
)を付けます。 ステップ 4 に記載されているように、 RealmModel
からRealmObject
を生成するには、これを行う必要があります。
RealmModel
にフィールドを追加します。 サポートされているすべての データ型を追加できます。 プロパティ注釈を使用して追加の 動作を含めます。
()class _Car { () late ObjectId id; late String make; late String? model; late int? miles; }
注意
クラス名は最大 57 文字の UTF-8 文字に制限されています。
RealmObject の生成
バージョン v 2.0.0での変更: 生成されたファイルの名前が ではなく になりました.realm.dart
.g.dart
アプリケーションで使用するRealmObject
を生成します。
dart run realm generate
dart run realm_dart generate
このコマンドは、モデル ファイルと同じディレクトリに ファイルを生成します。 これには、ステップ 2 の一部ディレクティブで指定した名前が含まれています。
Tip
生成された ファイルを追跡
Git などのバージョン管理システムで生成されたファイルを追跡します。
例
モデル生成後のファイル構造
. ├── schemas.dart ├── schemas.realm.dart // newly generated file ├── myapp.dart └── ...rest of application
Device Sync でのスキーマの使用
App Services スキーマは、アプリが永続化できるオブジェクトタイプをそれぞれ定義する有効なオブジェクト スキーマのリストです。 Realm 内のすべての同期されたオブジェクトは、App Services スキーマに準拠する必要があります。
クライアント アプリケーションは Realm を開くときにオブジェクト スキーマを提供します。 Realm にすでにデータが含まれている場合は、すでにスキーマが存在しており、それが開かれると、Realm はクライアント上のスキーマを既存のスキーマに対して検証します。
App Services スキーマは、次の方法で定義できます。
App Services を使用して App Services スキーマを明示的に定義します。
オブジェクト スキーマを App Services と正常に同期するには、スキーマで、 RealmModel
のプライマリキーとともにMapTo("_id")
アノテーションを使用する必要があります。
()class _SyncSchema { () "_id") ( late ObjectId id; // ... other properties }
スキーマの定義と、アプリケーションに対して考慮する必要があるアプローチの詳細については、 Realm スキーマの作成 に関するドキュメントを参照してください。
サポートされているデータ型
Realm スキーマは、Realm 固有のタイプに加えて、多くの Dart 言語のデータ型をサポートします。 サポートされているすべてのデータ型の包括的なリファレンスについては、「 データ型 」を参照してください。
プロパティ注釈
注釈 を使用して、Realm オブジェクトモデルのプロパティに機能を追加します。 注釈は、プロパティを null 可能としてマークする、プライマリキーを設定する、プロパティを無視するなどの目的で使用できます。 利用可能なプロパティ注釈の詳細については、「 プロパティ注釈 」を参照してください。
関係プロパティを定義する
スキーマ内の Realm オブジェクト間の関係を定義できます。 Realm Flutter SDK は、対 1 の関係、対多の関係、逆の関係、他のオブジェクト内へのオブジェクトの埋め込みをサポートしています。 Realm オブジェクト スキーマで関係を定義する方法の詳細については、「 関係 」を参照してください。
モデルまたはクラスを別の名前にマッピング
MapTo を使用できます Realm オブジェクトモデルまたはプロパティを Realm に保存されている別の名前にマッピングするための注釈。これは、次のシナリオで役立ちます。 例:
命名規則が異なるプラットフォーム間での操作を容易にします。 たとえば、Device Sync スキーマのプロパティ名がスニペットのケースを使用する場合、プロジェクトはキャメルケースを使用します。
移行を強制せずにクラスまたはフィールド名を変更します。
異なるパッケージで同じ名前の複数のモデル クラスをサポートします。
Realm によって強制される 57 文字の制限よりも長いクラス名を使用します。
Atlas Device Sync を使用している場合、 MapTo
注釈で指定した名前は永続化されたApp Services スキーマ名として使用されます。
()'naval_ship') (class _Boat { () late ObjectId id; late String name; late int? maxKnots; late int? nauticalMiles; }
class _Vehicle { () late ObjectId id; late String? maybeDescription; // optional value late double milesTravelled = 0; // 0 is default value () late String notInRealmModel; () late String make; 'wheels') // 'wheels' is property name in the RealmObject ( late int numberOfWheels; }
非構造化データのモデル化
バージョン2.0.0の新機能。
Flutter SDK バージョン2.0.0以降、 RealmValue
プロパティ内に混合データのコレクションを保存できます。 この機能を使用すると、厳密なデータモデルを定義することなく、JSON や MongoDB ドキュメントなどの複雑なデータ構造をモデル化できます。
非構造化データとは、期待されるスキーマに簡単に準拠していないデータであるため、個々のデータ クラスにモデル化するのが困難または非効率的です。 たとえば、アプリには、実行時に構造が不明な高度に変数データや動的データがある場合があります。
コレクションを混合プロパティに保存すると、Device Sync を使用する際のパフォーマンス的な同期など、機能を犠牲にすることなく柔軟性が高まります。 そして、混合されていないコレクションと同じ方法でそれらを操作できます。
混合コレクションは最大100レベルまでネストできます。
混合コレクションのReactに対応する と をクエリできます。
個々の混合コレクション要素を検索して更新できます。
ただし、混合コレクションにデータを保存する場合、構造化スキーマを使用したり、JSON string を単一の string プロパティに直列化したりする場合よりパフォーマンスが低くなります。
アプリ内の非構造化データをモデル化するには、スキーマ内の適切なプロパティをRealmValue型として定義します。 次に、これらのRealmValue
プロパティをRealmListまたはRealmValue
要素のRealmMapコレクションとして設定できます。 Note that RealmValue
cannot represent a RealmSet
or an embedded object.
たとえば、変数イベント ログ オブジェクトをモデル化するときに、混合データのマップを含むRealmValue
を使用できます。
// Define class with a `RealmValue` property ()class _EventLog { () late ObjectId id; late String eventType; late DateTime timestamp; late String userId; late RealmValue details; }
realm.write(() { // Add `eventLog` property data as a map of mixed data, which // also includes nested lists of mixed data realm.add(EventLog(ObjectId(), 'purchase', DateTime.now(), 'user123', details: RealmValue.from({ 'ipAddress': '192.168.1.1', 'items': [ {'id': 1, 'name': 'Laptop', 'price': 1200.00}, {'id': 2, 'name': 'Mouse', 'price': 49.99} ], 'total': 1249.99 }))); final eventLog = realm.all<EventLog>().first; final items = eventLog.details.asMap(); print(''' Event Type: ${eventLog.eventType} Timestamp: ${eventLog.timestamp} User ID: ${eventLog.userId} Details: Item: '''); for (var item in items.entries) { print('${item.key}: ${item.value}'); }
Event Type: purchase Timestamp: 2024-03-18 13:50:58.402979Z User ID: user123 Details: Item: ipAddress: RealmValue(192.168.1.1) items: RealmValue([RealmValue({id: RealmValue(1), name: RealmValue(Laptop), price: RealmValue(1200.0)}), RealmValue({id: RealmValue(2), name: RealmValue(Mouse), price: RealmValue(49.99)})]) total: RealmValue(1249.99)
Tip
型が不明であるが、各値には一意の識別子が付けられる場合は、混合データ型のマップを使用します。
型が不明であるが、オブジェクトの順序に意味がある場合は、混合データ型のリストを使用します。
Realm オブジェクトの生成
バージョン v 2.0.0での変更: 生成されたファイルの名前が ではなく になりました.realm.dart
.g.dart
Realm モデルが完了したら、 RealmObject を生成する必要があります クラスを使用してアプリケーション内で使用します。
次のコマンドを実行して、 RealmObjects
を生成します。
dart run realm generate
dart run realm_dart generate
これを実行すると、モデルの作成 セクションでRealmModel
クラスを定義したディレクトリに新しいファイルにパブリック クラスが作成されます。
生成されたファイルのベース名は、RealmModel
.realm.dart
を含むファイルと同じで、 で終わる。たとえば、 RealmModel
を含むファイルの名前がschemas.dart
の場合、生成されたファイルはschemas.realm.dart
になります。
注意
生成されたファイルをRealmModel
定義ファイルの一部ディレクティブに含めるようにします。
// ...import packages part 'schemas.realm.dart'; ()// ...model definition
データモデルが変更されるたびにRealmObjects
を生成するよう監視する場合は、コマンドに--watch
フラグを含めます。
dart run realm generate --watch
dart run realm_dart generate --watch
ジェネレーター キャッシュをクリーンにするには、コマンドに--clean
フラグを含めます。 ジェネレーター キャッシュをクリーンにするとデバッグ時に役立ちます。
dart run realm generate --clean
dart run realm_dart generate --clean
非対称オブジェクトの定義
バージョン 1.5.0 の新機能。
非対称オブジェクトには Flexible Sync が必要です。 非対称オブジェクトを定義するには、 ObjectType.asymmetricObject
を@RealmModel()
に渡します。
(ObjectType.asymmetricObject)class _WeatherSensor { () "_id") ( late ObjectId id; late String deviceId; late double modtemperatureInFahrenheitel; late double barometricPressureInHg; late double windSpeedInMph; }
Flutter SDK バージョン 1.5.0 以前では、 asymmetricObject
型からRealmObjects
にリンクできません。 SDK バージョン 1.6.0 以降では、埋め込みオブジェクト タイプに加えて、 asymmetricObject
タイプもRealmObjects
にリンクできます。
注意
非対称オブジェクトの読み取り試行
非対称オブジェクトは読み取れません。 非対称オブジェクトをクエリしようとすると、「エラー: 非対称クラスをクエリできません。」というエラーが表示されます。
Data Ingest の詳細については、「 Atlas へのデータのストリーム 」を参照してください。