Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

CRUD - 업데이트 - Java SDK

이 페이지의 내용

  • 해당 페이지의 예시에 대한 정보
  • 객체 수정
  • 객체 업서트
  • collection 업데이트
  • 반복

이 페이지의 예제에서는 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()

트랜잭션 내에서 선택한 언어로 다른 객체를 업데이트하는 것과 같은 방식으로 Realm 객체를 업데이트할 수 있습니다. 속성에 새 값을 할당하거나 속성을 업데이트하기만 하면 됩니다.

다음 예제에서는 거북의 이름을 'Archibald'로 변경하고 속성에 새 값을 할당하여 Archibald의 연령을 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
}

업서트는 지정된 기본 키를 사용하여 새 객체를 삽입하거나 해당 기본 키가 이미 있는 기존 객체를 업데이트하는 쓰기 작업입니다. 이 작업이 "업데이트 또는 삽입" 작업이기 때문에 이를 업서트라고 합니다. 이는 데이터 세트를 기존 영역으로 대량으로 가져올 때와 같이 객체가 존재하거나 존재하지 않을 수 있는 경우에 유용합니다. 업서팅은 새 항목을 추가하면서 기존 항목을 업데이트할 수 있는 우아한 방법입니다.

다음 예시 에서는 영역 을 사용하여 객체 를 업서트 하는 방법을 보여 줍니다. 'Drew'라는 새 거북 매니아를 만든 다음 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은 collection 전체에 대한 업데이트를 지원합니다. collection 업데이트는 collection에 있는 여러 객체의 특정 속성에 동일한 업데이트를 한 번에 적용합니다.

다음 예시는 컬렉션을 업데이트하는 방법을 보여줍니다. Turtle의 owner 속성과 TurtleEnthusiast의 turtles 속성 간의 암시적 역관계 덕분에 Realm은 setObject() 를 사용하여 컬렉션에 있는 모든 거북의 '소유자' 속성을 업데이트할 때 조세핀의 거북 목록을 자동으로 업데이트합니다.

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)
}

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

Iterator RealmResults 에서 생성된 객체는 스냅샷을 자동으로 사용합니다. Iterator 인스턴스에서 생성된 RealmList 객체는 스냅샷을 사용하지 않습니다 . RealmList.createSnapshot() 사용 또는 RealmResults.createSnapshot() 스냅샷 을 수동으로 생성하려면 수동으로 반복할 수 있습니다.

다음 예제에서는 RealmResults Iterator 에서 만든 암시적 스냅샷이나 RealmList 에서 만든 수동 스냅샷을 사용하여 collection을 안전하게 반복하는 방법을 보여 줍니다.

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"
}
}

돌아가기

읽기