Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

CRUD - 削除 - Java SDK

項目一覧

  • このページの例について
  • オブジェクトの削除
  • 複数のオブジェクトの削除
  • オブジェクトとその依存関係オブジェクトの削除
  • 特定のタイプのすべてのオブジェクトの削除
  • Realm 内のすべてのオブジェクトの削除
  • イテレータを使用したオブジェクトの削除

このページの例では、 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 からオブジェクトを削除するには、 RealmObjectサブクラスのdeleteFromRealm()メソッドの動的バージョンまたは静的バージョンのいずれかを使用します。

次の例は、 deleteFromRealm()を使用して Realm から 1 つのオブジェクトを削除する方法を示しています。

realm.executeTransaction(r -> {
// Get a turtle named "Tony".
Turtle tony = r.where(Turtle.class).equalTo("name", "Tony").findFirst();
tony.deleteFromRealm();
// discard the reference
tony = null;
});
realm.executeTransaction { r: Realm ->
// Get a turtle named "Tony".
var tony = r.where(Turtle::class.java)
.equalTo("name", "Tony")
.findFirst()
tony!!.deleteFromRealm()
// discard the reference
tony = null
}

Tip

削除後のオブジェクトを使用しない

オブジェクトが削除された後に使用しようとすると、SDK はエラーをスローします。

Realm からオブジェクトを削除するには、削除するオブジェクトを含むRealmResultsインスタンスのdeleteAllFromRealm()メソッドを使用します。 where()メソッドを使用して、 RealmResultsをオブジェクトのサブセットにフィルタリングできます。

次の例は、 deleteAllFromRealm()を使用して Realm からコレクションを削除する方法を示しています。

realm.executeTransaction(r -> {
// Find turtles older than 2 years old.
RealmResults<Turtle> oldTurtles = r.where(Turtle.class).greaterThan("age", 2).findAll();
oldTurtles.deleteAllFromRealm();
});
realm.executeTransaction { r: Realm ->
// Find turtles older than 2 years old.
val oldTurtles = r.where(Turtle::class.java)
.greaterThan("age", 2)
.findAll()
oldTurtles.deleteAllFromRealm()
}

場合によっては、親オブジェクトを削除するときに削除したい依存関係オブジェクトがあることもあります。 これを連鎖削除と呼びます。 Realm は依存しているオブジェクトを削除しません。 オブジェクトを自分で削除しない場合、Realm 内で孤立したままになります。 これが問題になるかどうかは、アプリケーションのニーズによって異なります。

現在のところ、依存関係オブジェクトを削除する最良の方法は、親オブジェクトを削除する前に、依存関係を反復処理して削除することです。

次の例では、まず Eli のタームをすべて削除し、次に Eli を削除するという連鎖削除を実行する方法を示しています。

realm.executeTransaction(r -> {
// Find a turtle enthusiast named "Ali"
TurtleEnthusiast ali = r.where(TurtleEnthusiast.class).equalTo("name", "Ali").findFirst();
// Delete all of ali's turtles
ali.getTurtles().deleteAllFromRealm();
ali.deleteFromRealm();
});
realm.executeTransaction { r: Realm ->
// Find a turtle enthusiast named "Ali"
val ali = r.where(TurtleEnthusiast::class.java)
.equalTo("name", "Ali").findFirst()
// Delete all of ali's turtles
ali!!.turtles!!.deleteAllFromRealm()
ali.deleteFromRealm()
}

Realm は、Realm からのRealm タイプのすべてのインスタンスの削除をサポートしています。

次の例は、 delete()を使用して Realm からすべての Torle インスタンスを削除する方法を示しています。

realm.executeTransaction(r -> {
r.delete(Turtle.class);
});
realm.executeTransaction { r: Realm ->
r.delete(Turtle::class.java)
}

すべてのオブジェクトを Realm から削除することができます。 これは Realm のスキーマには影響しません。 これは、プロトタイプ作成中に Realm をすばやくクリアするのに便利です。

次の例は、 deleteAll()を使用して Realm からすべてを削除する方法を示しています。

realm.executeTransaction(r -> {
r.deleteAll();
});
realm.executeTransaction { r: Realm ->
r.deleteAll()
}

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

例については、「反復 」を参照してください。

戻る

Update