このページでは、 Kotlin SDK を使用してローカルまたは同期された Realm からオブジェクトを削除する方法について説明します。
Realm から単一のオブジェクト、複数のオブジェクト、またはすべてのオブジェクトを削除することを選択できます。 オブジェクトを削除すると、そのオブジェクトにアクセスしたり変更したりすることができなくなります。 削除されたオブジェクトを使用しようとすると、Realm はエラーをスローします。
Realm からオブジェクトを削除しても、Realm ファイルは削除されず、Realm スキーマに影響はありません。 オブジェクト インスタンスのみが Realm から削除されます。 Realm ファイル自体を削除する場合は、「 Realm の削除 - Kotlin SDK 」を参照してください。
注意
同期された Realm への書き込み
Realm からオブジェクトを削除する構文は、ローカル Realm または同期された Realm で同じです。 ただし、同期された Realm での削除操作が成功するかどうかを判断する追加の考慮事項があります。 詳細については、「 同期された Realm へのデータの書き込み - Kotlin SDK 」を参照してください。
削除操作
削除操作を含む、Realm を変更するすべての操作は、書込みトランザクション内で実行する必要があります。 書込みトランザクションは、Realm の write()またはwriteBlocking()メソッドに渡されます。 このコールバック内でMutableRealmインスタンスにアクセスし、Realm 内のオブジェクトを削除できます。 書込みトランザクションと Realm がそれを処理する方法の詳細については、「 書込みトランザクション 」を参照してください。
書込みトランザクション内でのみアクセスできるライブ オブジェクトのみを削除できます。 MutableRealm.findLarge() を使用してトランザクション内で固定されたオブジェクトを実行中のオブジェクトに変換できます。
例
削除する前に凍結されたオブジェクトを変換
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 は他のオブジェクトへの参照のみを削除します。 参照先のオブジェクトは Realm 内に残りますが、親プロパティを介してクエリは実行できなくなります。
ただし、関連オブジェクトが埋め込まれている場合 のみの例外です。 EmbeddedRealmObjectとの関係を持つオブジェクトを削除すると、Realm は 段階的な削除で埋め込みオブジェクトを自動的に削除します。 詳細については、このページの「 埋め込みオブジェクトの削除」セクションを参照してください。
関連 Realm オブジェクトを使用した削除の連鎖
親オブジェクトを削除するときに関連するオブジェクトを削除する場合は、連鎖削除を実行することをお勧めします。 連鎖削除は、親オブジェクトを削除する前に、依存関係を反復処理して依存関係オブジェクトを手動で削除する操作で構成されています。 連鎖削除の詳細については、このページの「オブジェクトとその関連オブジェクトの削除」セクションを参照してください。
関連オブジェクトを自分で削除しない場合、Realm 内で孤立したままになります。 これが問題になるかどうかは、アプリケーションのニーズによって異なります。
Realm オブジェクトの削除
Realm から特定のオブジェクトを削除するには、次の手順に従います。
Realm.write()を使用して書込みトランザクションを開きます またはRealm.writeBlocking() の
query()を使用して、削除するオブジェクトのトランザクションの可変レルムをクエリして、ライブ オブジェクトを取得します。
query()に渡される型パラメータとしてオブジェクトタイプを指定します。(任意)クエリを指定して、返されたオブジェクトのセットをフィルタリングします。 クエリフィルターを含めない場合、指定された型のすべてのオブジェクトが返されます。 Kotlin SDK を使用したクエリの詳細については、「 Realm オブジェクトの読み取り - Kotlin SDK 」を参照してください。
重要
オブジェクトはライブでなければなりません
削除できるのは、ライブ オブジェクトのみです。 クエリが書込みトランザクションの外部で発生する場合は、
mutableRealm.findLatest()を使用してトランザクション内で固定オブジェクトをライブ オブジェクトに変換する必要があります。クエリによって返されたRealmResultsのセットをMutableRealm.delete() に渡します。
指定されたオブジェクトは Realm から削除され、アクセスや変更はできなくなります。 削除されたオブジェクトを使用しようとすると、Realm はエラーをスローします。
削除されたオブジェクトが別のオブジェクトとの関係を持つ場合、Realm は他のオブジェクトへの参照のみを削除します。 参照先のオブジェクトは Realm 内に残りますが、削除された親プロパティからクエリは実行できなくなります。 詳細については、「 オブジェクトとその関連オブジェクトの削除」セクションを参照してください。
Tip
オブジェクトがまだ使用可能かどうかは、 isValid()を呼び出すことで確認できます。 削除されたオブジェクトはfalseを返します。
単一オブジェクトの削除
単一のRealmObjectオブジェクトを削除するには、削除する特定のオブジェクトを返すフィルターを使用して、 オブジェクトタイプのクエリを実行します。
Tip
一意の識別情報の使用
クエリが正しいオブジェクトを返すように、 プライマリキー 値などの一意の識別情報でフィルタリングすることをお勧めします。
次の例では、特定のプライマリキーを持つFrogオブジェクトをクエリし、返されたオブジェクトをmutableRealm.delete()に渡して Realm から削除します。
// 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が「bul指定されている」である最初の 3 つのFrogオブジェクトをクエリし、その結果をmutableRealm.delete()に渡して Realm からそれらを削除します。
// 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) }
タイプのすべてのオブジェクトの削除
Realm から同時に特定のタイプのすべてのオブジェクトを削除するには、オブジェクトタイプをquery()に渡し、クエリフィルターを空のままにすると、そのタイプのすべてのオブジェクトが返されます。
次の例では、すべてのFrogオブジェクトをクエリし、その結果をmutableRealm.delete()に渡して、それらを Realm からすべて削除します。
// 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 を使用すると、すべてのタイプのすべての管理対象オブジェクトを削除できます。これは、プロトタイプ作成中に Realm をすばやくクリアするのに便利です。 これは、Realm スキーマや Realm によって管理されていないオブジェクトには影響しません。
Realm から同時にすべてのオブジェクトを削除するには、 MutableRealm.deleteAll()を呼び出します。 これにより、すべてのタイプのすべてのオブジェクトが削除されます。
次の例では、 deleteAll()を使用して Realm からすべてのオブジェクトを削除しています。
// Open a write transaction realm.write { // Delete all objects from the realm deleteAll() }
Tip
開発環境での deleteAll() の使用
deleteAll()メソッドは、開発中に Realm をすばやくクリアするのに便利です。 例えば、 オブジェクトを新しいスキーマに更新するための移行を作成する代わりに、すべてを削除してから、アプリ自体でオブジェクトを再生成した方が高速な場合があります。
関連オブジェクトの削除
親オブジェクトを削除しても、関連するオブジェクトが埋め込まれていない限り、その親に関連するオブジェクトは自動的に削除されません。 代わりに、Realm は関連オブジェクトへの参照のみを削除します。
次の例では、 Pondオブジェクトのリストを含むFrogオブジェクトがあります。 Frogオブジェクトを削除した後も、すべてのPondオブジェクトが Realm に残っていることを確認します。
// 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 によって自動的に削除されます。 親オブジェクトを削除した後も参照されたオブジェクトを保持する場合は、代わりに 1 対 1 の関係を持つ通常の Realm オブジェクトを使用します。
埋め込みオブジェクトは、親オブジェクトを介して段階的に削除するか、埋め込みオブジェクトを直接削除することで削除できます。
親オブジェクトを通じて埋め込みオブジェクトを削除するには、親オブジェクトを取得して削除します。 Realm は、すべての埋め込みオブジェクトを Realm から自動的に削除します。
埋め込みオブジェクト インスタンスを直接削除するには
特定の埋め込みオブジェクトを取得して削除します。
埋め込みオブジェクトへの親の参照をクリアし、埋め込みオブジェクト インスタンスも削除します。
次の例では、埋め込まれたEmbeddedAddressオブジェクトのリストを含むBusinessオブジェクトがあります。 Businessオブジェクトをクエリして削除します。これにより、埋め込まれたEmbeddedAddressオブジェクトがすべて自動的に削除されます。
// 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 コレクション インスタンスは、それらのオブジェクトへの参照のみを保存します。 オブジェクト自体を削除せずに、1 つ以上の参照されたオブジェクトをコレクションから削除できます。 コレクションから削除したオブジェクトは、手動で削除するまで Realm に残ります。 あるいは、Realm から Realm オブジェクトを削除すると、オブジェクトを含むすべてのコレクション インスタンスからそのオブジェクトも削除されます。
RealmList からの要素の削除
RealmListから、1 回のトランザクションで 1 つ以上の要素を削除できます。
リストから 1 つの要素を削除するには、その要素をlist.remove() に渡します。
リスト内の指定されたインデックスにある 1 つの要素を削除するには、そのインデックスをlist.removeAt() に渡します。
リストから複数の要素を削除するには、要素をlist.removeAll() に渡します。
list.client() を呼び出して、 すべての リスト要素を一度に削除することもできます。
次の例では、 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から、1 回のトランザクションで 1 つ以上の要素を削除できます。
セットから 1 つの要素を削除するには、削除する要素をset.remove() に渡します。
セットから複数の要素を削除するには、削除する要素をset.removeAll() に渡します。
set.client() を呼び出して、 すべての セット要素を一度に削除することもできます。
次の例では、 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 可能である必要があります)キーと値を削除するには、キーをdelete()に渡します
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(混合) 」を参照してください。
次の例では、 RealmAnyプロパティのリストを含むFrogオブジェクトと、最初のRealmAnyプロパティ値をクリアします。
realm.write { val frog = query<Frog>().find().first() frog.favoriteThings[0] = null }