2012-11-21 18 views
6

W dokumentacji w szerokim literaturze wytworzonego sposobem fabryki do usunięcia/usuwanie podklasy obiektu zarządzanego w CoreData do IOSusuwanie lub usuwanie ManagedObject w CoreData

(void)removeXXXObject:(NSManagedObject *)value 

gdzie XXX odpowiedni związek lub możemy użyj po prostu removeObject.

W moim kodzie użyłem to:

Data *lastData = [[self sortedPersonDatas] objectAtIndex:0]; 
[selectedPerson removePersonDatasObject:lastData]; 

gdzie PersonDatas jest relacja jeden-do-wielu danych zarządzanych obiekt z Wziąłem ostatnie dane (lastData wynikał z posortowanej tablicy wszystkich danych) Ale używając dwóch pierwszych metod usuwania i sprawdzania bazy danych SQL, możemy stwierdzić, że rzeczywiste dane istnieją tylko odwrotna relacja ma wartość zerową. Aby całkowicie usunąć dane (wszystkie atrybuty i obiektu) musiałem użyć:

[selectedPerson.managedObjectContext deleteObject:lastData]; 

Pytanie: który jest lepszy sposób i jest to prawidłowe, że CoreData pozostawia dane nienaruszone?

+0

Czy zapisujesz kontekst po operacji usuwania? –

+0

Tak, zapisałem kontekst, to nie problem. – BootMaker

Odpowiedz

7

removeXXXObject usuwa tylko obiekt ze związku typu to-many, ale nie usuwa obiektu ze sklepu. Aby to zrobić, musisz rzeczywiście używać deleteObject - jest to pożądane zachowanie. Wywołanie deleteObject domyślnie ustawi także odpowiednie relacje na zero (zobacz https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW1).

+0

Dziękuję za szybką odpowiedź, ale nie jestem absolutnie przekonany, że to zachowanie jest poprawne. W oparciu o dokumenty, które również cytowałeś, jeśli zmienisz zasadę relacji (tutaj: personDatas) z nullifii na kaskadę, musisz usunąć obiekt, tak jak w dokumentach Apple: "Usuń obiekty w miejscu docelowym relacji." Ale jak już wypróbowałem, "removeXXXObject" z regułą kaskadową nie usuwa obiektu, po prostu niweluje związek, który jest niepokojący, ponieważ reguła zerowania robi to samo. Dziwne. – BootMaker

+2

@ BootMaker: "Usuń regułę: Kaskada" oznacza: Jeśli obiekt "Osoba" zostanie usunięty, wówczas wszystkie powiązane obiekty "Dane" również zostaną usunięte. Nie oznacza to, że: jeśli obiekt "Dane" zostanie usunięty z powiązanej "Osoby", to zostanie usunięty. - A więc "reguła usuwania" określa: "Co się stanie, jeśli ten obiekt zostanie usunięty?" –

+0

@Martin R: To, co powiedziałeś, jest tym, co wcześniej myślałem o zasadzie kaskady, ale to, co mówią docenci Apple, jest inne, docelowym obiektem relacji są Dane. Twoje pytanie: Nie znam odpowiedzi, ponieważ to nie jest problem, ale spróbuję tego dla zabawy. – BootMaker