Atlas Device SDK は非推奨です。 詳細については、 の
廃止ページを参照してください。
このページの例では、 Project
とTask
の 2 つの Realm オブジェクトタイプを持つプロジェクト管理アプリのデータモデルを使用します。 Project
には 0 個以上のTasks
があります。
これらの 2 つのクラス、 Project
とTask
のスキーマを以下で参照してください。
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; |
} |
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<>(); |
} |
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() |
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 -> { |
|
Turtle turtle = r.where(Turtle.class).findFirst(); |
|
|
turtle.setName("Archibald"); |
turtle.setAge(101); |
}); |
realm.executeTransaction { r: Realm -> |
|
val turtle = r.where(Turtle::class.java).findFirst() |
|
|
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); |
|
|
r.insertOrUpdate(drew); |
TurtleEnthusiast andy = new TurtleEnthusiast(); |
andy.set_id(id); |
andy.setName("Andy"); |
andy.setAge(56); |
|
|
r.insertOrUpdate(andy); |
}); |
realm.executeTransaction { r: Realm -> |
val id = ObjectId() |
val drew = TurtleEnthusiast() |
drew._id = id |
drew.name = "Drew" |
drew.age = 25 |
|
|
r.insertOrUpdate(drew) |
val andy = TurtleEnthusiast() |
andy._id = id |
andy.name = "Andy" |
andy.age = 56 |
|
|
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); |
|
|
r.insertOrUpdate(drew); |
TurtleEnthusiast andy = new TurtleEnthusiast(); |
andy.set_id(id); |
andy.setName("Andy"); |
|
|
|
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 |
|
|
r.insertOrUpdate(drew) |
val andy = TurtleEnthusiast() |
andy._id = id |
andy.name = "Andy" |
|
|
r.copyToRealmOrUpdate(andy, |
ImportFlag.CHECK_SAME_VALUES_BEFORE_SET) |
} |
Realm はコレクション全体の更新をサポートしています。 コレクション更新は、コレクション内の複数のオブジェクトの特定のプロパティに対して同じ更新を一度に適用します。
次の例は、コレクションを更新する方法を示しています。 タームのowner
プロパティと TableEnthusiast のturtles
プロパティの間の暗黙的な逆関係により、 setObject()を使用してコレクション内のすべてのタームの「所有者」プロパティを更新すると、Realm は自動的にデータベースのタームのリストを更新します。
realm.executeTransaction(r -> { |
|
TurtleEnthusiast josephine = r.createObject(TurtleEnthusiast.class, new ObjectId()); |
josephine.setName("Josephine"); |
|
|
RealmResults<Turtle> turtles = r.where(Turtle.class).equalTo("name", "Pierogi").findAll(); |
|
|
turtles.setObject("owner", josephine); |
}); |
realm.executeTransaction { r: Realm -> |
|
val josephine = realm.createObject( |
TurtleEnthusiast::class.java, |
ObjectId() |
) |
josephine.name = "Josephine" |
|
|
val turtles = r.where(Turtle::class.java) |
.equalTo("name", "Pierogi") |
.findAll() |
|
|
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(); |
|
|
realm.executeTransaction(r -> { |
for (Frog frog : frogs) { |
frog.setSpecies("Lithobates catesbeiana"); |
} |
}); |
|
|
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() |
|
|
realm.executeTransaction { |
for (frog in frogs) { |
frog.species = "Lithobates catesbeiana" |
} |
} |
|
|
realm.executeTransaction { |
val frogsSnapshot = frogs.createSnapshot() |
for (i in frogsSnapshot.indices) { |
frogsSnapshot[i]!!.species = "Lithobates catesbeiana" |
} |
} |