2015-04-02 3 views
5

Rzućmy poniższym przykładzie:Usuń model z królestwa, ale zachować obiekt żywy

Współpracujemy z zestawu zwierząt. Załóżmy, że nie potrzebujemy wszystkich zwierząt, które utrwalono w bazie danych, i istnieje logika kontrolująca dodawanie i usuwanie zwierząt z bazy danych.

Na przykład mam obiekt, konia, z własnością ciągową name z "Suey", i dodaję ją do sfery, z addObject:. Teraz mamy ten obiekt zapisany w Królestwie. Ten obiekt jest ważny i możemy wykonać horse.name, który zwróci "Suey".

Co dalej, muszę usunąć Suey z DB. Robię deleteObject:. Niestety, usuwa on nie tylko utrwalone informacje o koniu, ale także unieważnił mój obiekt. Suey jest w zasadzie martwa, więc jeśli chcę ją z powrotem w DB, muszę stworzyć kolejnego konia od podstaw, a dopiero potem będę mógł mieć kolejną Suey w DB.

Czy istnieje inny sposób utrzymania Suey przy życiu, więc mam większą elastyczność w zarządzaniu jej stanem?

Mam nadzieję, że wyjaśniłem, proszę dać mi znać, jeśli masz jakieś pytania.

Z góry dziękuję!

UPDATE

koń jest zaangażowany w jeden-do-wielu relacji, więc żywotność również wpływ właściwości w podobnych modeli.

+0

Czy istnieje relacja jeden do wielu? Czy istnieje możliwość dodania wielu godzin, takich jak "Suey", a następnie "Duey"? Jeśli nie, to zamiast usuwać obiekt, możesz ustawić wartość nazwy na zero. I podczas dodawania, jeśli obiekt istnieje, można ustawić właściwość name zamiast addObject. – Samir

+0

Tak, istnieją relacje jeden-do-wielu. Zaktualizuję pytanie, dziękuję. – Dumoko

Odpowiedz

1

Obiekty w krainie to accessory dla równoważnego obiektu w bazie danych. Jeśli z jakiegoś powodu musisz "odłączyć" zmienną obiektową od jej reprezentacji na dysku, możesz skopiować ją do pamięci. Łatwym sposobem na to jest stworzenie nowego, un-utrzymywał obiekt z treścią utrzymywały One:

// Assuming `Horse` inherits from `RLMObject` and `persistedHorse` is attached to an `RLMRealm`. 
Horse *persistedHorse = ...; 
Horse *inMemoryHorseCopy = [[Horse alloc] initWithObject:persistedHorse]; 
// This will create a new `Horse` object, not tied to an RLMRealm, 
// by copying the contents of `persistedHorse`. 

Można użyć tego samego podejścia, gdy trzeba skopiować istniejący RLMObject albo w stan oczekiwania sam obiekt (jak wyżej) lub w inną dziedzinę.

+0

Zauważyłem, że obiekt Realm nie implementuje protokołu 'NSCoding', więc w zasadzie chodzi o zaimplementowanie czegoś podobnego do metody' -copy'. Ok, dzięki za podzielenie się pomysłem, będę pamiętać, że to jest sposób na "odłączenie". Dziękuję Ci! – Dumoko

1

Zgodnie z documentation każda modyfikacja obiektu wynikowego zapytania (w twoim przypadku Object Horse z nazwą Suey) modyfikuje dane na dysku bezpośrednio, ponieważ wynikiem są rzeczywiste dane, a nie ich kopia. Więc jeśli usuniesz konia, musisz stworzyć nowy.