Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

CRUD - Update - Java SDK

項目一覧

  • このページの例について
  • オブジェクトの変更
  • オブジェクトのアップサート
  • コレクションの更新
  • 反復

このページの例では、 ProjectTaskの 2 つの Realm オブジェクトタイプを持つプロジェクト管理アプリのデータモデルを使用します。 Projectには 0 個以上のTasksがあります。

これらの 2 つのクラス、 ProjectTaskのスキーマを以下で参照してください。

ProjectTask.java
import org.bson.types.ObjectId;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.RealmClass;
import io.realm.annotations.Required;
public class ProjectTask extends RealmObject {
@PrimaryKey
public ObjectId _id;
@Required
public String name;
public String assignee;
public int progressMinutes;
public boolean isComplete;
public int priority;
@Required
public String _partition;
}
Project.java
import org.bson.types.ObjectId;
import io.realm.RealmList;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.RealmClass;
import io.realm.annotations.Required;
public class Project extends RealmObject {
@PrimaryKey
public ObjectId _id;
@Required
public String name;
public RealmList<ProjectTask> tasks = new RealmList<>();
}
ProjectTask.kt
import io.realm.RealmObject
import io.realm.annotations.PrimaryKey
import io.realm.annotations.Required
import org.bson.types.ObjectId
open class ProjectTask(
@PrimaryKey
var _id: ObjectId = ObjectId(),
@Required
var name: String = "",
var assignee: String? = null,
var progressMinutes: Int = 0,
var isComplete: Boolean = false,
var priority: Int = 0,
var _partition: String = ""
): RealmObject()
Project.kt
import io.realm.RealmList
import io.realm.RealmObject
import io.realm.annotations.PrimaryKey
import io.realm.annotations.Required
import org.bson.types.ObjectId
open class Project(
@PrimaryKey
var _id: ObjectId = ObjectId(),
@Required
var name: String = "",
var tasks: RealmList<ProjectTask> = RealmList(),
): RealmObject()

トランザクション内で、選択した言語の他のオブジェクトを更新するのと同じ方法で、Realm オブジェクトを更新できます。 プロパティに新しい値を割り当てるか、プロパティをアップデートします。

次の例では、タームの名前を「アーカイブ」に変更し、 プロパティに新しい値を割り当てて、アービドの経過時間を 101 に設定します。

realm.executeTransaction(r -> {
// Get a turtle to update.
Turtle turtle = r.where(Turtle.class).findFirst();
// Update properties on the instance.
// This change is saved to the realm.
turtle.setName("Archibald");
turtle.setAge(101);
});
realm.executeTransaction { r: Realm ->
// Get a turtle to update.
val turtle = r.where(Turtle::class.java).findFirst()
// Update properties on the instance.
// This change is saved to the realm.
turtle!!.name = "Archibald"
turtle.age = 101
}

アップサートとは、指定されたプライマリキーを持つ新しいオブジェクトを挿入するか、そのプライマリキーをすでに持っている既存のオブジェクトを更新する書込み操作です。 これは「更新または挿入」操作であるため、アップサートと呼ばれます。 これは、データセットを既存の Realm に一括インポートする場合など、オブジェクトがまだ存在する場合と存在しない場合がある場合に便利です。 アップサートは、新しいエントリを追加しながら既存のエントリを更新する優れた方法です。

次の例は、Realm を使用してオブジェクトをアップサートする方法を示しています。 「Dbrew」という名前の新しいタームを使用するユーザーを作成し、 insertOrUpdate() を使用して、その名前を「Andy」にアップデートします。

realm.executeTransaction(r -> {
ObjectId id = new ObjectId();
TurtleEnthusiast drew = new TurtleEnthusiast();
drew.set_id(id);
drew.setName("Drew");
drew.setAge(25);
// Add a new turtle enthusiast to the realm. Since nobody with this id
// has been added yet, this adds the instance to the realm.
r.insertOrUpdate(drew);
TurtleEnthusiast andy = new TurtleEnthusiast();
andy.set_id(id);
andy.setName("Andy");
andy.setAge(56);
// Judging by the ID, it's the same turtle enthusiast, just with a different name.
// As a result, you overwrite the original entry, renaming "Drew" to "Andy".
r.insertOrUpdate(andy);
});
realm.executeTransaction { r: Realm ->
val id = ObjectId()
val drew = TurtleEnthusiast()
drew._id = id
drew.name = "Drew"
drew.age = 25
// Add a new turtle enthusiast to the realm. Since nobody with this id
// has been added yet, this adds the instance to the realm.
r.insertOrUpdate(drew)
val andy = TurtleEnthusiast()
andy._id = id
andy.name = "Andy"
andy.age = 56
// Judging by the ID, it's the same turtle enthusiast, just with a different name.
// As a result, you overwrite the original entry, renaming "Drew" to "Andy".
r.insertOrUpdate(andy)
}

また、 copyToRealmOrUpdate()を使用して、指定されたオブジェクトに基づいて新しいオブジェクトを作成するか、同じプライマリキー値を持つ既存のオブジェクトを更新することもできます。 CHECK_SAME_VALUES_BEFORE_SET ImportFlagを使用して、指定されたオブジェクト内の異なるフィールドのみをアップデートします。

次の例は、 オブジェクトを挿入する方法を示しています。また、同じプライマリキーを持つオブジェクトがすでに存在する場合は、異なるフィールドのみをアップデートします。

realm.executeTransaction(r -> {
ObjectId id = new ObjectId();
TurtleEnthusiast drew = new TurtleEnthusiast();
drew.set_id(id);
drew.setName("Drew");
drew.setAge(25);
// Add a new turtle enthusiast to the realm. Since nobody with this id
// has been added yet, this adds the instance to the realm.
r.insertOrUpdate(drew);
TurtleEnthusiast andy = new TurtleEnthusiast();
andy.set_id(id);
andy.setName("Andy");
// Judging by the ID, it's the same turtle enthusiast, just with a different name.
// As a result, you overwrite the original entry, renaming "Drew" to "Andy".
// the flag passed ensures that we only write the updated name field to the db
r.copyToRealmOrUpdate(andy, ImportFlag.CHECK_SAME_VALUES_BEFORE_SET);
});
realm.executeTransaction { r: Realm ->
val id = ObjectId()
val drew = TurtleEnthusiast()
drew._id = id
drew.name = "Drew"
drew.age = 25
// Add a new turtle enthusiast to the realm. Since nobody with this id
// has been added yet, this adds the instance to the realm.
r.insertOrUpdate(drew)
val andy = TurtleEnthusiast()
andy._id = id
andy.name = "Andy"
// Judging by the ID, it's the same turtle enthusiast, just with a different name.
// As a result, you overwrite the original entry, renaming "Drew" to "Andy".
r.copyToRealmOrUpdate(andy,
ImportFlag.CHECK_SAME_VALUES_BEFORE_SET)
}

Realm はコレクション全体の更新をサポートしています。 コレクション更新は、コレクション内の複数のオブジェクトの特定のプロパティに対して同じ更新を一度に適用します。

次の例は、コレクションを更新する方法を示しています。 タームのownerプロパティと TableEnthusiast のturtlesプロパティの間の暗黙的な逆関係により、 setObject()を使用してコレクション内のすべてのタームの「所有者」プロパティを更新すると、Realm は自動的にデータベースのタームのリストを更新します。

realm.executeTransaction(r -> {
// Create a turtle enthusiast named Josephine.
TurtleEnthusiast josephine = r.createObject(TurtleEnthusiast.class, new ObjectId());
josephine.setName("Josephine");
// Get all turtles named "Pierogi".
RealmResults<Turtle> turtles = r.where(Turtle.class).equalTo("name", "Pierogi").findAll();
// Give all turtles named "Pierogi" to Josephine
turtles.setObject("owner", josephine);
});
realm.executeTransaction { r: Realm ->
// Create a turtle enthusiast named Josephine.
val josephine = realm.createObject(
TurtleEnthusiast::class.java,
ObjectId()
)
josephine.name = "Josephine"
// Get all turtles named "Pierogi".
val turtles = r.where(Turtle::class.java)
.equalTo("name", "Pierogi")
.findAll()
// Give all turtles named "Pierogi" to Josephine
turtles.setObject("owner", josephine)
}

Realm コレクションは常に最新の状態を反映するため、コレクションを反復処理している間に表示されたり、消えたり、変更されたりする可能性があります。 反復処理できる安定したコレクションを取得するには、コレクションのデータのスナップショットを作成します。 スナップショットは、要素が削除または変更された場合でも、要素の順序が変更されないことを保証します。

Iterator RealmResultsから作成されたオブジェクトは自動的にスナップショットを使用します。 Iteratorインスタンスから作成された オブジェクトはスナップショットを使用しませRealmList ん 。RealmList.createSnapshot() の使用 またはRealmResults.createSnapshot() スナップショットを手動で生成するには、手動で反復処理できます。

次の例は、 RealmResults Iteratorから作成された暗黙的なスナップショットまたはRealmListから作成された手動スナップショットのいずれかを使用して、コレクションを安全に反復処理する方法を示しています。

RealmResults<Frog> frogs = realm.where(Frog.class)
.equalTo("species", "bullfrog")
.findAll();
// Use an iterator to rename the species of all bullfrogs
realm.executeTransaction(r -> {
for (Frog frog : frogs) {
frog.setSpecies("Lithobates catesbeiana");
}
});
// Use a snapshot to rename the species of all bullfrogs
realm.executeTransaction(r -> {
OrderedRealmCollectionSnapshot<Frog> frogsSnapshot = frogs.createSnapshot();
for (int i = 0; i < frogsSnapshot.size(); i++) {
frogsSnapshot.get(i).setSpecies("Lithobates catesbeiana");
}
});
val frogs = realm.where(Frog::class.java)
.equalTo("species", "bullfrog")
.findAll()
// Use an iterator to rename the species of all bullfrogs
realm.executeTransaction {
for (frog in frogs) {
frog.species = "Lithobates catesbeiana"
}
}
// Use a snapshot to rename the species of all bullfrogs
realm.executeTransaction {
val frogsSnapshot = frogs.createSnapshot()
for (i in frogsSnapshot.indices) {
frogsSnapshot[i]!!.species = "Lithobates catesbeiana"
}
}

戻る

読み取り