문서 메뉴
문서 홈
/ /
Atlas Device SDK
/ / /

Realm 객체 삭제 - Kotlin SDK

이 페이지의 내용

  • 삭제 작업
  • 관련 객체 및 참조
  • Realm 객체 삭제
  • 단일 객체 삭제
  • 여러 객체 삭제
  • 유형의 모든 객체 삭제
  • Realm의 모든 객체 삭제
  • 관련 객체 삭제
  • 객체 및 관련 객체 삭제
  • 내장된 객체 삭제
  • 컬렉션에서 요소 제거
  • RealmList에서 요소 제거
  • RealmSet에서 요소 제거
  • 사전 키/값 제거
  • RealmAny(혼합) 속성 값 삭제

이 페이지에서는 Kotlin SDK를 사용하여 로컬 또는 동기화된 영역에서 객체를 삭제하는 방법에 대해 설명합니다.

영역에서 단일 객체, 여러 객체 또는 모든 객체를 삭제하도록 선택할 수 있습니다. 객체를 삭제한 후에는 더 이상 해당 객체에 액세스하거나 수정할 수 없습니다. 삭제된 객체를 사용하려고 하면 Realm에서 오류가 발생합니다.

영역에서 객체를 삭제해도 영역 파일이 삭제되거나 영역 스키마에 영향을 주지 는 않습니다 . 영역에서 객체 인스턴스만 삭제합니다. Realm 파일 자체를 삭제하려면 Realm 삭제 - Kotlin SDK를 참조하세요.

참고

동기화된 Realm에 쓰기

영역에서 객체를 삭제하는 구문은 로컬 영역이나 동기화 영역에서 동일합니다. 그러나 동기화된 영역의 삭제 작업이 성공했는지 여부를 결정하는 데에는 추가 고려 사항이 있습니다. 자세한 내용은 동기화된 영역에 데이터 쓰기 - Kotlin SDK를 참조하세요.

삭제 작업을 포함하여 영역을 수정하는 모든 작업은 쓰기 트랜잭션( write transaction) 내에서 수행되어야 합니다. 쓰기 트랜잭션(write transaction)은 Realm의 write() 또는 writeBlocking() 메서드로 전달됩니다. 이 콜백 내에서 MutableRealm 인스턴스에 액세스한 다음 영역 내의 객체를 삭제할 수 있습니다. 쓰기 트랜잭션(write transaction)과 Realm에서 쓰기 트랜잭션(write transaction)을 처리하는 방법에 대한 자세한 내용은 쓰기 트랜잭션(write transaction)을 참조하세요 .

쓰기 트랜잭션(write transaction) 내부에서만 액세스할 수 있는 라이브 객체만 삭제할 수 있습니다. mutableRealm.findLatest()를 사용하여 트랜잭션에서 동결된 객체를 라이브 객체로 변환할 수 있습니다.

예제

삭제하기 전에 고정된 객체 변환

val frozenFrog = realm.query<Frog>("name == $0", "Kermit").find().firstOrNull()
// Open a write transaction
realm.writeBlocking {
// Get the live frog object with findLatest(), then delete it
if (frozenFrog != null) {
findLatest(frozenFrog)
?.also { delete(it) }
}
}

다른 객체와의 관계 속성이 있는 객체를 삭제하면 Realm은 관련 객체의 인스턴스를 자동으로 삭제하지 않습니다. 대신 Realm은 다른 객체에 대한 레퍼런스만 삭제합니다. 참조된 객체는 영역에 남아 있지만 더 이상 상위 속성을 통해 쿼리할 수 없습니다.

유일한 예외는 관련 객체가 포함된 경우입니다. EmbeddedRealmObject 와 관계가 있는 객체를 삭제하면 Realm은 계단식 삭제 를 통해 내장된 객체를 자동으로 삭제합니다. 자세한 내용은 이 페이지 의 내장된 객체 삭제 섹션을 참조하세요.

상위 객체를 삭제할 때 관련 객체를 삭제하려면 연쇄 삭제 를 수행하는 것이 좋습니다. 연쇄 삭제는 종속성을 반복하여 종속 객체를 수동으로 삭제하고 상위 객체를 삭제하기 전에 종속 객체를 삭제하는 것으로 구성됩니다. 연쇄 삭제에 대한 자세한 내용은 이 페이지 의 객체 및 관련 객체 삭제 섹션을 참조하세요.

관련 객체를 직접 삭제하지 않으면 해당 객체는 영역에서 고아 상태로 유지됩니다. 이것이 문제가 되는지 여부는 애플리케이션의 요구 사항에 따라 다릅니다.

영역에서 특정 객체를 삭제하려면 다음을 따릅니다:

  1. realm.write() 로 쓰기 트랜잭션(write transaction)을 엽니다. 또는 realm.writeBlocking().

  2. query()를 사용하여 삭제하려는 객체에 대해 트랜잭션의 변경 가능한 영역을 쿼리하여 라이브 객체를 가져옵니다.

    1. query()에 전달된 유형 매개 변수로 객체 유형을 지정합니다.

    2. (선택 사항) 쿼리를 지정하여 반환된 객체 세트를 필터링합니다. 쿼리 필터를 포함하지 않으면 지정된 유형의 모든 객체가 반환됩니다. Kotlin SDK를 사용한 쿼리에 대한 자세한 내용은 Realm 객체 읽기 - Kotlin SDK를 참조하세요.

    중요

    객체가 라이브 상태여야 함

    라이브 객체만 삭제할 수 있습니다. 쿼리가 쓰기 트랜잭션(write transaction) 외부에서 발생하는 경우 mutableRealm.findLatest()를 사용하여 고정된 객체를 트랜잭션의 라이브 객체로 변환해야 합니다.

  3. 쿼리에서 반환된 RealmResults 세트를 mutableRealm.delete()에 전달합니다.

  4. 지정된 객체가 영역에서 삭제되며 더 이상 액세스하거나 수정할 수 없습니다. 삭제된 객체를 사용하려고 하면 Realm에서 오류가 발생합니다.

    삭제된 객체가 다른 객체와 관계가 있는 경우 Realm은 다른 객체에 대한 참조만 삭제합니다. 참조된 객체는 영역에 남아 있지만 삭제된 상위 속성을 통해 더 이상 쿼리할 수 없습니다. 자세한 내용 은 객체 및 관련 객체 삭제 섹션을 참조하세요.

객체가 여전히 유효한지 여부는 isValid() 를 호출하여 확인할 수 있습니다. 삭제된 객체는 false 을 반환합니다.

단일 RealmObject 객체를 삭제하려면 삭제하려는 특정 객체를 반환하는 필터를 사용하여 객체 유형을 쿼리하세요.

고유 식별 정보 사용

쿼리가 올바른 객체를 반환하도록 하려면 기본 키 값과 같은 고유 식별 정보로 필터링하는 것이 좋습니다.

다음 예제에서는 특정 기본 키가 있는 Frog 객체를 쿼리하고 반환된 객체를 mutableRealm.delete()로 전달하여 영역에서 삭제합니다.

// Open a write transaction
realm.write {
// Query the Frog type and filter by primary key value
val frogToDelete: Frog = query<Frog>("_id == $0", PRIMARY_KEY_VALUE).find().first()
// Pass the query results to delete()
delete(frogToDelete)
}

여러 객체를 동시에 삭제하려면 객체 유형을 query()에 전달하고 삭제하려는 모든 객체를 반환하는 쿼리를 지정합니다.

다음 예에서는 species가 'bullfrog'인 처음 세 개의 Frog 객체를 쿼리한 다음 결과를 mutableRealm.delete()에 전달하여 영역에서 삭제합니다.

// Open a write transaction
realm.write {
// Query by species and limit to 3 results
val bullfrogsToDelete: RealmResults<Frog> = query<Frog>("species == 'bullfrog' LIMIT(3)").find()
// Pass the query results to delete()
delete(bullfrogsToDelete)
}

영역에서 특정 유형의 모든 객체를 동시에 삭제하려면 객체 유형을 query()에 전달하고 쿼리 필터를 비워 두어 해당 유형의 모든 객체를 반환합니다.

다음 예제에서는 모든 Frog 객체를 쿼리하고 결과를 mutableRealm.delete()에 전달하여 영역에서 모두 삭제합니다.

// Open a write transaction
realm.write {
// Query Frog type with no filter to return all frog objects
val frogsLeftInTheRealm = query<Frog>().find()
// Pass the query results to delete()
delete(frogsLeftInTheRealm)
}

Kotlin SDK를 사용하면 모든 유형의 관리되는 모든 객체를 삭제할 수 있으므로 프로토타입을 제작하는 동안 영역을 빠르게 정리하는 데 유용합니다. 이는 영역 스키마나 영역에서 관리되지 않는 객체에는 영향을 주지 않습니다.

영역에서 모든 객체를 동시에 삭제하려면 mutableRealm.deleteAll() 을 호출합니다. 이렇게 하면 모든 유형의 모든 객체가 삭제됩니다.

다음 예에서는 deleteAll()을 사용하여 영역에서 모든 객체를 삭제합니다.

// Open a write transaction
realm.write {
// Delete all objects from the realm
deleteAll()
}

개발에서 deleteAll() 사용

deleteAll() 메서드는 개발 중에 영역을 빠르게 정리할 때 유용합니다. 예를 들면 마이그레이션을 작성해서 객체를 새 스키마로 업데이트하는 것보다는, 앱 자체로 객체를 삭제했다가 다시 생성하는 것이 더 빠를 수 있습니다.

관련 객체가 내장되지 않은 경우 상위 객체를 삭제해도 관련된 객체는 자동으로 삭제되지 않습니다. 대신 Realm은 관련 객체에 대한 레퍼런스만 삭제합니다.

다음 예제에서는 Pond 객체 목록이 있는 Frog 객체가 있습니다. Frog 객체를 삭제한 후 모든 Pond 객체가 여전히 영역에 남아 있는지 확인합니다.

// Open a write transaction
realm.write {
// Query for the parent frog object with ponds
val parentObject = query<Frog>("_id == $0", PRIMARY_KEY_VALUE).find().first()
assertEquals(2, parentObject.favoritePonds.size)
// Delete the frog and all references to ponds
delete(parentObject)
// Confirm pond objects are still in the realm
val ponds = query<Pond>().find()
assertEquals(2, ponds.size)
}

상위 객체를 삭제할 때 관련 객체를 삭제하려면 관련 객체를 직접 수동으로 삭제해야 합니다. 먼저 삭제하려는 상위 객체를 쿼리한 다음 상위 객체의 관계를 반복하여 관련된 각 객체를 삭제하는 방식으로 연쇄 삭제를 수행할 것을 권장합니다. 마지막으로 상위 객체 자체를 삭제합니다.

다음 예에서는 'Kermit'이라는 이름의 Frog 객체를 쿼리한 다음 객체의 favoritePonds 속성을 반복하여 각 Pond 객체를 삭제합니다. 그런 다음 Frog 객체 자체를 삭제합니다:

realm.write {
// Query for the parent frog object with ponds
val frog = query<Frog>("name == $0", "Kermit").find().first()
val ponds = frog.favoritePonds
// Iterate over the list and delete each pond object
if (ponds.isNotEmpty()) {
ponds.forEach { pond ->
delete(pond)
}
}
// Delete the parent frog object
val frogToDelete = findLatest(frog)
if (frogToDelete != null) {
delete(frogToDelete)
}
}

경고

Realm은 포함된 객체에 계단식 삭제를 사용함

Realm 객체를 삭제하면 Realm은 해당 객체가 참조하는 모든 내장된 객체를 자동으로 삭제합니다. 상위 객체를 삭제한 후에도 참조된 객체가 유지되도록 하려면 to-one 관계가 있는 일반 Realm 객체를 대신 사용합니다.

계단식 삭제 또는 직접 삭제를 통해 상위 객체에서 내장된 객체를 삭제할 수 있습니다.

  • 상위 객체를 통해 내장된 객체를 삭제하려면 상위 객체를 가져와 삭제합니다. Realm은 해당 영역에 내장된 모든 객체를 자동으로 삭제합니다.

  • 내장된 객체 인스턴스를 직접 삭제하려면 다음 안내를 따릅니다:

    • 특정 내장된 객체를 가져오고 삭제합니다.

    • 내장된 객체에 대한 상위 참조를 지우면 내장된 객체 인스턴스도 삭제됩니다.

다음 예제에서는 내장된 EmbeddedAddress 객체 목록이 포함된 Business 객체가 있습니다. 내장된 모든 EmbeddedAddress 객체를 자동으로 삭제하는 Business 객체를 쿼리하고 삭제합니다.

// Delete the parent object
realm.write {
val businessToDelete = query<Business>("name == $0", "Big Frog Corp.").find().first()
// Delete the parent object (deletes all embedded objects)
delete(businessToDelete)
}

다음 예제에는 EmbeddedAddress 객체가 내장된 Contact 객체가 있습니다. EmbeddedAddress 객체를 직접 삭제하고 상위 객체를 통해 다른 객체를 삭제합니다:

// Delete an embedded object directly
realm.write {
val addressToDelete = query<EmbeddedAddress>("street == $0", "456 Lily Pad Ln").find().first()
// Delete the embedded object (nullifies the parent property)
delete(addressToDelete)
}
// Delete an embedded object through the parent
realm.write {
val propertyToClear = query<Contact>("name == $0", "Kermit").find().first()
// Clear the parent property (deletes the embedded object instance)
propertyToClear.address = null
}

객체를 포함하는 영역 컬렉션 인스턴스는 해당 객체에 대한 참조만 저장합니다. 객체 자체를 삭제하지 않고도 컬렉션에서 하나 이상의 참조 객체를 제거할 수 있습니다. 컬렉션에서 제거한 객체는 수동으로 삭제할 때까지 영역에 남아 있습니다. 또는 영역에서 Realm 객체를 삭제하면 해당 객체가 포함된 컬렉션 인스턴스에서도 해당 객체가 삭제됩니다.

RealmList에서 단일 트랜잭션의 요소를 하나 이상 제거할 수 있습니다.

list.clear() 를 호출하여 모든 목록 요소를 한 번에 제거할 수도 있습니다.

다음 예제에서는 Pond 객체 목록이 있는 Forest 객체가 있습니다. 목록이 빌 때까지 일련의 작업을 통해 목록 요소를 제거합니다.

// Open a write transaction
realm.write {
// Query for the parent forest object
val forest = query<Forest>("name == $0", "Hundred Acre Wood").find().first()
val forestPonds = forest.nearbyPonds
assertEquals(5, forestPonds.size)
// Remove the first pond in the list
val removeFirstPond = forestPonds.first()
forestPonds.remove(removeFirstPond)
assertEquals(4, forestPonds.size)
// Remove the pond at index 2 in the list
forestPonds.removeAt(2)
assertEquals(3, forestPonds.size)
// Remove the remaining three ponds in the list
forestPonds.removeAll(forestPonds)
assertEquals(0, forestPonds.size)
}

다음 예제에서는 Pond 객체 목록이 있는 Forest 객체가 있습니다. list.clear() 메서드를 사용하여 모든 목록 요소를 제거합니다:

// Open a write transaction
realm.write {
val forest = query<Forest>("name == $0", "Hundred Acre Wood").find().first()
val forestPonds = forest.nearbyPonds
assertEquals(5, forestPonds.size)
// Clear all ponds from the list
forestPonds.clear()
assertEquals(0, forestPonds.size)
}

RealmSet에서 단일 트랜잭션의 요소를 하나 이상 제거할 수 있습니다.

set.clear() 를 호출하여 모든 세트 요소를 한 번에 제거할 수도 있습니다.

다음 예제에는 Snack 객체 세트가 있는 Frog 객체가 있습니다. 세트가 빌 때까지 일련의 작업을 통해 세트 요소를 제거합니다.

// Open a write transaction
realm.write {
// Query for the parent frog object
val myFrog = query<RealmSet_Frog>("name == $0", "Kermit").find().first()
val snackSet = myFrog.favoriteSnacks
assertEquals(3, snackSet.size)
// Remove one snack from the set
snackSet.remove(snackSet.first { it.name == "Flies" })
assertEquals(2, snackSet.size)
// Remove the remaining two snacks from the set
val allSnacks = findLatest(myFrog)!!.favoriteSnacks
snackSet.removeAll(allSnacks)
assertEquals(0, snackSet.size)
}

다음 예제에는 Snack 객체 세트가 있는 Frog 객체가 있습니다. set.clear() 메서드를 사용하여 모든 세트 요소를 제거합니다:

realm.write {
val myFrog = realm.query<RealmSet_Frog>("name == $0", "Kermit").find().first()
val snackSet = findLatest(myFrog)!!.favoriteSnacks
assertEquals(3, snackSet.size)
// Clear all snacks from the set
snackSet.clear()
assertEquals(0, snackSet.size)
}

다음과 같은 몇 가지 방법으로 RealmDictionary 항목을 제거할 수 있습니다.

  • 값은 제거하고 키는 유지하려면 키를 null (사전 값은 null을 허용해야 함)로 설정합니다.

  • 키와 값을 제거하려면 remove()에 키를 전달합니다.

clear() 를 호출하여 모든 키와 값을 제거할 수도 있습니다.

다음 예에는 String 값 사전이 포함된 Frog 객체가 있습니다. 사전이 빌 때까지 일련의 작업을 통해 사전 요소를 제거합니다.

// Find frogs who have forests with favorite ponds
val thisFrog = realm.query<Frog>("favoritePondsByForest.@count > 1").find().first()
// Set an optional value for a key to null if the key exists
if (thisFrog.favoritePondsByForest.containsKey("Hundred Acre Wood")) {
realm.write {
val mutableFrog = findLatest(thisFrog)
if (mutableFrog != null) {
mutableFrog.favoritePondsByForest["Hundred Acre Wood"] = null
}
}
}
realm.write {
// Remove a key and its value
findLatest(thisFrog)?.favoritePondsByForest?.remove("Lothlorien")
// Remove all keys and values
findLatest(thisFrog)?.favoritePondsByForest?.clear()
assertTrue(thisFrogUpdated.favoritePondsByForest.isEmpty())
}

RealmAny 인스턴스는 null 값을 저장할 수 없지만 속성에 직접 null을 할당하여 RealmAny 속성 값을 삭제할 수 있습니다. RealmAny 데이터 유형에 대한 자세한 내용은 RealmAny(Mixed)를 참조하세요.

다음 예제에서는 RealmAny 속성 목록이 있는 Frog 객체가 있고 첫 번째 RealmAny 속성 값을 지웁니다.

realm.write {
val frog = query<Frog>().find().first()
frog.favoriteThings[0] = null
}
← 업데이트