Docs Menu
Docs Home
/ /
Atlas Device SDK
/ / /

Realm オブジェクト スキーマの定義 - Flutter SDK

項目一覧

  • モデルの作成
  • Realm のインポート
  • 生成されたファイル部分のディレクティブを作成
  • RealmModel の作成
  • RealmObject の生成
  • アプリケーションでの RealmObject の使用
  • Device Sync でのスキーマの使用
  • サポートされているデータ型
  • プロパティ注釈
  • 関係プロパティを定義する
  • モデルまたはクラスを別の名前にマッピング
  • 非構造化データのモデル化
  • Realm オブジェクトの生成
  • 非対称オブジェクトの定義

重要

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 内のオブジェクトタイプ間の関係を定義することもできます。

1

ファイルの先頭に Realm SDK パッケージをインポートします。

schemas.dart
import 'package:realm/realm.dart';
schemas.dart
import 'package:realm_dart/realm.dart';
2

バージョン v 2.0.0での変更: 生成されたファイルの名前が ではなく になりました.realm.dart.g.dart

ステップ 4 で生成したRealmObjectファイルを、現在作業しているファイルと同じパッケージに含めるための部分ディレクティブを追加します。

schemas.dart
part 'schemas.realm.dart';
3

Realm スキーマのモデルを作成します。 アノテーションを含める必要があります RealmModel クラス定義の上部にある。

ステップ 4 のアプリケーション全体で使用される公開RealmObjectを生成するには、 RealmModelを使用します。

モデルをプライベートまたはパブリックにすることができます。 すべてのモデルをプライベート化し、単一のファイルで定義することをお勧めします。 クラス名の前にアンダースコア( _ )を付けて、プライベートクラスにします。

複数のファイルにわたってスキーマを定義する必要がある場合は、RealmModel をパブリックにすることができます。 モデルを公開するには、名前の前にドル記号( $ )を付けます。 ステップ 4 に記載されているように、 RealmModelからRealmObjectを生成するには、これを行う必要があります。

RealmModelにフィールドを追加します。 サポートされているすべての データ型を追加できます。 プロパティ注釈を使用して追加の 動作を含めます。

schemas.dart
@RealmModel()
class _Car {
@PrimaryKey()
late ObjectId id;
late String make;
late String? model;
late int? miles;
}

注意

クラス名は最大 57 文字の UTF-8 文字に制限されています。

4

バージョン 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
5

アプリケーションの前のステップで生成したRealmObjectを使用します。 生成された ファイルは、ステップ 2 でRealmModelを定義したのと同じパッケージの一部として含まれていたため、 RealmModelを使用してファイルをインポートしてRealmObjectにアクセスします。

myapp.dart
import './schemas.dart';
final hondaCivic = Car(ObjectId(), 'Honda', model: 'Civic', miles: 99);

App Services スキーマは、アプリが永続化できるオブジェクトタイプをそれぞれ定義する有効なオブジェクト スキーマのリストです。 Realm 内のすべての同期されたオブジェクトは、App Services スキーマに準拠する必要があります。

クライアント アプリケーションは Realm を開くときにオブジェクト スキーマを提供します。 Realm にすでにデータが含まれている場合は、すでにスキーマが存在しており、それが開かれると、Realm はクライアント上のスキーマを既存のスキーマに対して検証します。

App Services スキーマは、次の方法で定義できます。

オブジェクト スキーマを App Services と正常に同期するには、スキーマで、 RealmModelのプライマリキーとともにMapTo("_id")アノテーションを使用する必要があります。

@RealmModel()
class _SyncSchema {
@PrimaryKey()
@MapTo("_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 スキーマ名として使用されます。

@RealmModel()
@MapTo('naval_ship')
class _Boat {
@PrimaryKey()
late ObjectId id;
late String name;
late int? maxKnots;
late int? nauticalMiles;
}
class _Vehicle {
@PrimaryKey()
late ObjectId id;
late String? maybeDescription; // optional value
late double milesTravelled = 0; // 0 is default value
@Ignored()
late String notInRealmModel;
@Indexed()
late String make;
@MapTo('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
@RealmModel()
class _EventLog {
@PrimaryKey()
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

  • 型が不明であるが、各値には一意の識別子が付けられる場合は、混合データ型のマップを使用します。

  • 型が不明であるが、オブジェクトの順序に意味がある場合は、混合データ型のリストを使用します。

バージョン 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定義ファイルの一部ディレクティブに含めるようにします。

schemas.dart
// ...import packages
part 'schemas.realm.dart';
@RealmModel()
// ...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()に渡します。

@RealmModel(ObjectType.asymmetricObject)
class _WeatherSensor {
@PrimaryKey()
@MapTo("_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 へのデータのストリーム 」を参照してください。

戻る

モデルデータ