CRUD - Java SDK
書込み操作
Realm でオブジェクトを作成し、Realm 内のオブジェクトを更新し、最終的に Realm からオブジェクトを削除することができます。 これらの操作は Realm の状態を変更するため、書込み (write) と呼びます。
Realm はトランザクション単位で書込み (write) を処理します。 トランザクションは 、Realm が単一の分割不可の操作として取り扱う読み取り操作と書込み (write) 操作のリストです。 言い換えれば、トランザクションはすべてであるか、または何もなかったようになります。つまり、トランザクション内のすべての操作が成功するか、トランザクション内のどの操作が有効になりません。
注意
すべての書込み (write) はトランザクション内で発生する必要があります。
Realm では一度に 1 つの書込みトランザクションのみが許可されます。 Realm は、開いているトランザクションが完了するまで、他のスレッドへの他の書込みをブロックします。 その結果、トランザクション内で Realm から値を読み取るときに競合状態は発生しません。
トランザクションが完了すると、Realm はトランザクションをコミットまたはキャンセルします。
Realm がトランザクションをコミットすると、Realm はすべての変更をディスクに書込みます。 同期された Realm の場合、Realm は Atlas App Services との同期のために変更をキューに入れます。
Realm が書込みトランザクションをキャンセルするか、トランザクション内の操作によってエラーが発生すると、すべての変更は破棄されます(または「ロールバック」)。
Tip
Realm オブジェクトの書込みはファイルの書込み
Realm オブジェクトを作成、アップデート、または削除するたびに、その変更によって Realm 内のそのオブジェクトの表現がアップデートされ、サブスクライブされたリスナーに通知が発行されます。 そのため、データを永続化するために必要な場合にのみ、Realm オブジェクトに書込む必要があります。
重要
UI スレッドでの同期読み取りと書込み
デフォルトでは、非同期トランザクションを使用して、アプリケーションの UI スレッド内の Realm の読み取りまたは書き込みのみが可能です。 つまり、同期メソッドの使用を明示的に許可しない限り、Android アプリケーションのメイン スレッドで名前がAsync
で終わる Realm
メソッドのみを使用できます。
この制限はアプリケーション ユーザーのメリットのために存在します。UI スレッドで読み取りおよび書込み操作を実行すると、UI のインタラクションが応答しなくなったり低速になったりする可能性があるため、通常、これらの操作は非同期またはバックグラウンド スレッドで取り扱うことをお勧めします。 ただし、アプリケーションで同期 Realm の読み取りまたは UI スレッドでの書込みを使用する必要がある場合は、次のSyncConfiguration
オプションを使用して同期メソッドの使用を明示的に許可できます。
SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser(), PARTITION) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .build(); Realm.getInstanceAsync(config, new Realm.Callback() { public void onSuccess(Realm realm) { Log.v( "EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread." ); } });
val config = SyncConfiguration.Builder(app.currentUser(), PARTITION) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .build() Realm.getInstanceAsync(config, object : Realm.Callback() { override fun onSuccess(realm: Realm) { Log.v("EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread.") } })
管理対象オブジェクト
管理対象オブジェクトは、Realm 内の基礎データに対する変更に基づいて更新されるライブ Realm オブジェクトです。 管理対象オブジェクトは開いている Realm からのみ取得され、その Realm が開いている限り更新を受け取ることができます。 管理対象オブジェクトは スレッド 間で渡すことができません。
管理されていないオブジェクト
管理対象ではないオブジェクトは、ライブではない Realm オブジェクトのインスタンスです。 Realm オブジェクトを自分で手動で構築するか、 Realm. copyFromRealm()を呼び出すことで、管理されていないオブジェクトを取得できます。 管理されていないオブジェクトは スレッド 間で渡すことができます。
トランザクションの実行
Realm は、各トランザクションを 0 個以上の読み取りおよび書込み (write) 操作を含むコールバック関数として表します。 トランザクションを実行するには、トランザクションのコールバックを定義し、それを Realm のwrite
メソッドに渡します。 このコールバック内では、Realm の作成、読み取り、アップデート、および削除を無料で実行できます。 Realm が実行時にコールバック内のコードが例外をスローした場合、Realm はトランザクションをキャンセルします。 それ以外の場合、Realm はコールバックの後にトランザクションをコミットします。
例
次のコードは、 executionTransaction()またはexecutionTransactionAsync( ) を使用してトランザクションを実行する方法を示しています。コールバックのコードが例外をスローした場合、Realm はトランザクションをキャンセルします。 それ以外の場合、Realm はトランザクションをコミットします。
realm.executeTransaction(r -> { // Create a turtle enthusiast named Ali. TurtleEnthusiast ali = r.createObject(TurtleEnthusiast.class, new ObjectId()); ali.setName("Ali"); // Find turtles younger than 2 years old RealmResults<Turtle> hatchlings = r.where(Turtle.class).lessThan("age", 2).findAll(); // Give all hatchlings to Ali. hatchlings.setObject("owner", ali); });
realm.executeTransaction { r: Realm -> // Create a turtle enthusiast named Ali. val ali = r.createObject(TurtleEnthusiast::class.java, ObjectId()) ali.name = "Ali" // Find turtles younger than 2 years old val hatchlings = r.where(Turtle::class.java).lessThan("age", 2).findAll() // Give all hatchlings to Ali. hatchlings.setObject("owner", ali) }