Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

CRUD - 삭제 - Java SDK

이 페이지의 내용

  • 해당 페이지의 예시에 대한 정보
  • 객체 삭제
  • 여러 객체 삭제
  • 객체 및 해당 종속 객체 삭제
  • 특정 타입의 모든 객체 삭제
  • Realm의 모든 객체 삭제
  • 반복자를 사용하여 객체 삭제

이 페이지의 예제에서는 ProjectTask 라는 두 가지 Realm 객체 유형이 있는 프로젝트 관리 앱의 Realm 데이터 모델을 사용합니다. 에는 이(가) 0개 이상 Project Tasks 있습니다.

아래에서 이 두 클래스의 스키마 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()

영역 에서 객체 를 삭제 하려면 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에서 오류가 발생합니다.

영역 에서 객체를 삭제 하려면 삭제 하려는 객체 가 포함된 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은 사용자를 대신해 종속 객체를 삭제하지 않습니다. 객체를 직접 삭제하지 않으면 해당 객체는 영역에서 고아 상태로 유지됩니다. 이것이 문제가 되는지 여부는 애플리케이션의 요구 사항에 따라 다릅니다.

현재 종속 객체를 삭제하는 가장 좋은 방법은 상위 객체를 삭제하기 전에 종속성을 반복하고 삭제하는 것입니다.

다음 예에서는 먼저 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)
}

영역에서 모든 객체를 삭제할 수 있습니다. 이는 영역의 스키마에 영향을 주지 않습니다. 이는 프로토타입을 제작하는 동안 영역을 빠르게 정리할 때 유용합니다.

다음 예제에서는 deleteAll()을 사용하여 영역에서 모든 항목을 삭제하는 방법을 보여 줍니다.

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

영역 collection은 항상 최신 상태를 반영하기 때문에 collection을 반복하는 동안 나타나거나, 사라지거나, 변경될 수 있습니다. 반복할 수 있는 안정적인 collection을 얻으려면 collection 데이터의 스냅샷 을 만들면 됩니다. 스냅샷은 요소가 삭제되더라도 요소 순서가 변경되지 않도록 보장합니다.

예제는 반복을 참조하세요.

돌아가기

Update