CRUD - 删除 - Java SDK
关于本页中的示例
本页上的示例使用具有两种 Realm 对象类型的项目管理应用的Realm 数据模型: Project
和Task
。 Project
具有零个或多个Tasks
。
请参阅 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 { public ObjectId _id; public String name; public String assignee; public int progressMinutes; public boolean isComplete; public int priority; 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 { public ObjectId _id; 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( var _id: ObjectId = ObjectId(), 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( var _id: ObjectId = ObjectId(), var name: String = "", var tasks: RealmList<ProjectTask> = RealmList(), ): RealmObject()
删除对象
要从域中删除对象,请使用 RealmObject子类的deleteFromRealm()
方法的动态或静态版本。
以下示例展示了如何使用deleteFromRealm()从域中删除一个对象:
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 }
提示
请勿在删除对象后使用该对象
如果您在删除对象后尝试使用该对象,则 SDK 会引发错误。
删除多个对象
要从Realm 中删除对象,请使用包含要删除的对象的 RealmResults删除的{ 域 } deleteAllFromRealm()
。 您可以使用where()方法从RealmResults
过滤出对象的子集。
以下示例演示了如何使用deleteAllFromRealm()从域中删除集合:
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 中将保持孤立状态。 这是否是一个问题取决于应用程序的需求。
目前,删除依赖对象的最佳方法是遍历依赖项并在删除父对象之前删除依赖对象。
以下示例演示了如何通过首先删除 Ali 的所有海龟,然后删除 Ali 来执行链式删除:
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 类型的所有实例。
以下示例演示了如何使用删除 ()从域中删除所有 Turtle 实例:
realm.executeTransaction(r -> { r.delete(Turtle.class); });
realm.executeTransaction { r: Realm -> r.delete(Turtle::class.java) }
删除 Realm 中的所有对象
可以从 Realm 中删除所有对象。 这不会影响 Realm 的模式。 这对于在原型设计时快速清理 Realm 非常有用。
以下示例演示了如何使用deleteAll() 从 Realm 中删除所有内容:
realm.executeTransaction(r -> { r.deleteAll(); });
realm.executeTransaction { r: Realm -> r.deleteAll() }
使用迭代器删除对象
由于 域 collection始终反映最新状态,因此当您迭代collection时,它们可能会出现、消失或更改。要获得可迭代的稳定collection,可以创建collection数据的快照。快照可保证元素的顺序不会更改,即使删除元素也是如此。
有关示例,请参阅迭代。