CRUD - 作成 - Flutter SDK
Atlas Device SDK は、オブジェクトを永続化するために高効率のストレージ エンジンを使用します。 データベース内のオブジェクトを作成し、更新し、最終的にデータベースからオブジェクトを削除することができます。 これらの操作はデータベースの状態を変更するため、書込み (write) と呼ばれます。
書込みトランザクション (write transaction)
SDK はトランザクション単位で書込みを処理します。 トランザクションは 、SDK が単一の分割不可の操作として取り扱う読み取りと書込み操作のリストです。 言い換えれば、トランザクションはすべてであるか、または何もなかったようになります。つまり、トランザクション内のすべての操作が成功するか、トランザクション内のどの操作が有効になりません。
すべての書込み (write) はトランザクション内で発生する必要があります。
データベースでは一度に 1 つのトランザクションのみを許可します。 SDK は、オープン トランザクションが完了するまで、他のスレッドへの他の書込みをブロックします。 その結果、トランザクション内で データベースから値を読み取るときに競合状態は発生しません。
トランザクションが完了すると、SDK はトランザクションをコミットまたはキャンセルします。
SDK がトランザクションをコミットすると、すべての変更がディスクに書込まれます。 同期されたデータベースの場合、SDK は Atlas Device Sync との同期のために変更をキューに入れます。
SDK が書込みトランザクションをキャンセルするか、トランザクション内の操作によってエラーが発生すると、すべての変更は破棄されます(または「ロールバック」)。
書込み操作
データベースを開くと、 Realm.write() を使用してその中にオブジェクトを作成できます トランザクション ブロック。
realm.write((){ // ...write data to realm });
書込みトランザクションのコールバック関数 から値を返すこともできます。
final yoda = realm.write<Person>(() { return realm.add(Person(ObjectId(), 'Yoda')); });
警告
1 つの Realm ファイルへの Realm オブジェクトの書込み
RealmObjects
は単一の Realm ファイルにのみ書き込みできます。 すでに 1 つの Realm ファイルにRealmObject
を書き込んだ場合に別のデータベースに書込み (write) しようとすると、SDK はRealmException
をスローします。
バックグラウンド書込み (write)
Realm.writeAsync() を使用して、オブジェクトを非同期に追加、変更、または削除できます。
Realm.writeAsync()
を使用して書込み操作を実行する場合、書込みロックの取得とトランザクションのコミットはバックグラウンドで発生します。 書込み自体はメイン プロセスで発生します。
これにより、メイン プロセスの実行のブロックに費やされる時間を短縮できます。 これは、Sync クライアントがいつ書き込みを行うかが不明な場合、Device Sync を使用する場合に特に便利です。
// Add Leia to the realm using `writeAsync` Person leia = Person(ObjectId(), "Leia"); realm.writeAsync(() { realm.add<Person>(leia); });
オブジェクトの作成
このページの例では、 Person
とTeam
という 2 つのオブジェクトタイプを使用しています。
()class _Person { () late ObjectId id; late String name; late List<String> hobbies; } ()class _Team { () late ObjectId id; late String name; late List<_Person> crew; late RealmValue eventLog; }
単一オブジェクトの作成
データベースにオブジェクトを追加するには、 Realm.add() を使用して、書込みトランザクション ブロックで Realm オブジェクト クラスのインスタンスをデータベースに渡します。
realm.write(() { realm.add(Person(ObjectId(), 'Lando')); });
複数のオブジェクトの作成
データベースに複数のオブジェクトを追加するには、複数のオブジェクトのリストを Realm.addAll() に渡します 書込みトランザクション (write transaction) ブロック内。
realm.write(() { realm.addAll([ Person(ObjectId(), 'Figrin D\'an'), Person(ObjectId(), 'Greedo'), Person(ObjectId(), 'Toro') ]); });