Realm 객체 삭제 - Kotlin SDK
이 페이지의 내용
이 페이지에서는 Kotlin SDK를 사용하여 로컬 또는 동기화된 영역에서 객체를 삭제하는 방법에 대해 설명합니다.
영역에서 단일 객체, 여러 객체 또는 모든 객체를 삭제하도록 선택할 수 있습니다. 객체를 삭제한 후에는 더 이상 해당 객체에 액세스하거나 수정할 수 없습니다. 삭제된 객체를 사용하려고 하면 Realm에서 오류가 발생합니다.
영역에서 객체를 삭제해도 영역 파일이 삭제되거나 영역 스키마에 영향을 주지 않습니다. 영역에서 객체 인스턴스만 삭제합니다. 영역 파일 자체를 삭제하려면 Realm 삭제 - Kotlin SDK를 참조하세요.
참고
동기화된 Realm에 쓰기
영역에서 객체를 삭제하는 구문은 로컬 영역이나 동기화 영역에서 동일합니다. 그러나 동기화된 영역의 삭제 작업이 성공했는지 여부를 결정하는 데에는 추가 고려 사항이 있습니다. 자세한 내용은 동기화된 Realm에 데이터 쓰기 - Kotlin SDK를 참조하세요.
삭제 작업
삭제 작업을 포함하여 영역 을 수정하는 모든 작업은 쓰기 트랜잭션( 쓰기 트랜잭션 (write transaction)) 내에서 수행되어야 합니다. 쓰기 트랜잭션(write transaction)은 영역의 쓰기 (write)() 또는 writeBlocking() 메서드로 전달됩니다. 이 콜백 내에서 MutableRealm 인스턴스 에 액세스 한 다음 영역 내의 객체를 삭제 수 있습니다. 쓰기 트랜잭션(write transaction)과 Realm 에서 쓰기 트랜잭션(write transaction)을 처리하는 방법에 대한 자세한 내용은 쓰기 (write) 트랜잭션(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은 계단식 삭제 를 통해 내장된 객체를 자동으로 삭제합니다. 자세한 내용은 이 페이지 의 내장된 객체 삭제 섹션을 참조하세요.
관련 Realm 객체로 연쇄 삭제
상위 객체 를 삭제 때 관련 객체를 삭제 하려면 연쇄 삭제 를 수행하는 것이 좋습니다. 연쇄 삭제 는 종속성을 반복하여 종속 객체를 수동으로 삭제하고 상위 객체 를 삭제하기 전에 종속 객체를 삭제하는 것으로 구성됩니다. 연쇄 삭제에 대한 자세한 내용은 이 페이지 의 객체 및 관련 객체 삭제 섹션을 참조하세요.
관련 객체를 직접 삭제하지 않으면 해당 객체는 영역에서 고아 상태로 유지됩니다. 이것이 문제가 되는지 여부는 애플리케이션의 요구 사항에 따라 다릅니다.
Realm 객체 삭제
영역에서 특정 객체를 삭제하려면 다음을 따릅니다:
realm.write() 로 쓰기 트랜잭션(write transaction)을 엽니다. 또는 realm.writeBlocking().
쿼리 ()를 사용하여 삭제 하려는 객체에 대해 트랜잭션의 변경 가능한 영역 을 쿼리하여 라이브 객체 를 가져옵니다.
query()
에 전달된 유형 매개 변수로 객체 유형을 지정합니다.(선택 사항) 쿼리를 지정하여 반환된 객체 세트를 필터링합니다. 쿼리 필터를 포함하지 않으면 지정된 유형의 모든 객체가 반환됩니다. Kotlin SDK를 사용한 쿼리에 대한 자세한 내용은 Realm 객체 읽기 - Kotlin SDK를 참조하세요.
중요
객체가 라이브 상태여야 함
라이브 객체만 삭제할 수 있습니다. 쿼리가 쓰기 트랜잭션(write transaction) 외부에서 발생하는 경우
mutableRealm.findLatest()
를 사용하여 고정된 객체를 트랜잭션의 라이브 객체로 변환해야 합니다.쿼리 에서 반환된 RealmResults 설정하다 를 mutableRealm 에 전달합니다. 삭제().
지정된 객체가 영역에서 삭제되며 더 이상 액세스하거나 수정할 수 없습니다. 삭제된 객체를 사용하려고 하면 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) }
Realm의 모든 객체 삭제
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 객체를 대신 사용합니다.
계단식 삭제 또는 직접 삭제를 통해 상위 객체에서 내장된 객체를 삭제할 수 있습니다.
상위 객체를 통해 내장된 객체를 삭제하려면 상위 객체를 가져와 삭제합니다. 영역은 해당 영역에 모든 내장된 객체를 자동으로 삭제합니다.
내장된 객체 인스턴스를 직접 삭제하려면 다음 안내를 따릅니다:
특정 내장된 객체를 가져오고 삭제합니다.
내장된 객체에 대한 상위 참조를 지우면 내장된 객체 인스턴스도 삭제됩니다.
다음 예시에서는 내장된 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에서 요소 제거
RealmList에서 단일 트랜잭션 의 요소를 하나 이상 제거 할 수 있습니다.
목록에서 하나의 요소를 제거 하려면 요소를 목록으로 전달 합니다. ()을 제거 합니다.
목록의 지정된 인덱스 에 있는 요소를 하나 제거 하려면 list.removeAt()에 인덱스 를 전달합니다.
목록에서 여러 요소를 제거 하려면 list.removeAll()에 요소를 전달합니다.
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에서 요소 제거
RealmSet에서 단일 트랜잭션의 요소를 하나 이상 제거할 수 있습니다.
세트에서 하나의 요소를 제거하려면 삭제하려는 요소를 set.remove()에 전달합니다.
설정하다 에서 여러 요소를 제거 삭제 요소를 설정하다.removeAll()에 전달합니다.
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을 허용해야 함)로 설정합니다.키와 값을 제거 하려면 제거()에 키를 전달합니다.
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(혼합) 속성 값 삭제
RealmAny
인스턴스는 null 값을 저장할 수 없지만 속성에 직접 null
을 할당하여 RealmAny
속성 값을 삭제할 수 있습니다. RealmAny
데이터 유형에 대한 자세한 내용은 RealmAny(Mixed)를 참조하세요.
다음 예시에서는 RealmAny
속성 목록이 있는 Frog
객체가 있고 첫 번째 RealmAny
속성 값을 지웁니다.
realm.write { val frog = query<Frog>().find().first() frog.favoriteThings[0] = null }