Atlas Device SDK는 더 이상 사용되지 않습니다. 자세한 내용은 지원 중단 페이지 를 참조하세요.
해당 페이지의 예시에 대한 정보
이 페이지의 예제에서는 Project 및 Task 라는 두 가지 Realm 객체 유형이 있는 프로젝트 관리 앱의 Realm 데이터 모델을 사용합니다. 에는 이(가) 0개 이상 ProjectTasks 있습니다.
아래에서 이 두 클래스의 스키마 Project 및 Task를 참조하세요.
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;
publicclassProjectTaskextendsRealmObject {
@PrimaryKey
public ObjectId _id;
@Required
public String name;
public String assignee;
publicint progressMinutes;
publicboolean isComplete;
publicint 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;
publicclassProjectextendsRealmObject {
@PrimaryKey
public ObjectId _id;
@Required
public String name;
public RealmList<ProjectTask> tasks = newRealmList<>();
}
ProjectTask.kt
import io.realm.RealmObject
import io.realm.annotations.PrimaryKey
import io.realm.annotations.Required
import org.bson.types.ObjectId
openclassProjectTask(
@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
openclassProject(
@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.
Turtleturtle= 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 -> {
ObjectIdid=newObjectId();
TurtleEnthusiastdrew=newTurtleEnthusiast();
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);
TurtleEnthusiastandy=newTurtleEnthusiast();
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_SETImportFlag 를 사용합니다.
다음 예에서는 객체를 삽입하거나 동일한 기본 키를 가진 객체가 이미 있는 경우 다른 필드만 업데이트하는 방법을 보여 줍니다.
realm.executeTransaction(r -> {
ObjectIdid=newObjectId();
TurtleEnthusiastdrew=newTurtleEnthusiast();
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);
TurtleEnthusiastandy=newTurtleEnthusiast();
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
// 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)
}
collection 업데이트
Realm은 collection 전체에 대한 업데이트를 지원합니다. collection 업데이트는 collection에 있는 여러 객체의 특정 속성에 동일한 업데이트를 한 번에 적용합니다.
다음 예시는 컬렉션을 업데이트하는 방법을 보여줍니다. Turtle의 owner 속성과 TurtleEnthusiast의 turtles 속성 간의 암시적 역관계 덕분에 Realm은 setObject() 를 사용하여 컬렉션에 있는 모든 거북의 '소유자' 속성을 업데이트할 때 조세핀의 거북 목록을 자동으로 업데이트합니다.
영역 collection은 항상 최신 상태를 반영하기 때문에 collection을 반복하는 동안 나타나거나, 사라지거나, 변경될 수 있습니다. 반복할 수 있는 안정적인 collection을 얻으려면 collection 데이터의 스냅샷 을 만들면 됩니다. 스냅샷은 요소가 삭제되거나 수정되더라도 요소의 순서가 변경되지 않도록 보장합니다.