Podstawowe dane-existingObjectWithID: error: causes error 133000

Moja aplikacja wykorzystuje podstawowe dane (z pomocą magicznego zapisu) i jest raczej mocno wielowątkowa za pomocą NSOperation.

Oczywiście jestem bardzo ostrożny, aby przechodzić tylko NSManagedObjectID pomiędzy wątkami / operacjami.

Teraz, aby wrócić do odpowiedniego zarządzanego obiektu w operacji, używam -existingObjectWithID:error: Tak:

Collection *owner = (Collection *)[localContext existingObjectWithID:self.containerId error:&error];

Ale to co dostaję to zero i error mówi, że to błąd #13300: NSManagedObjectReferentialIntegrityError.

Oto, co dokumentacja mówi o tym błędzie:

NSManagedObjectReferentialIntegrityError
Error code to denote an attempt to fire a fault pointing to an object that does not exist.
The store is accessible, but the object corresponding to the fault cannot be found.

Które nie jest prawdą w moim przypadku: ten obiekt istnieje. W rzeczy samej, jeśli iteruję przez wszystkie instancje tego Collection bytu z NSFetchRequest, znajduję go wśród nich, a jego NSManagedObjectID jest dokładnie tą, którą przekazałem -existingObjectWithID:error:.

Ponadto, jeśli użyję -objectWithID: zamiast tego, dostaję poprawny obiekt z powrotem.

Więc coś mi umyka. Oto kilka dodatkowych uwag / pytań:
  • "obiekt, który nie istnieje": jakie jest Znaczenie słowa "istnieć" w tym zdaniu? "istnieć" gdzie? Zdecydowanie "istnieje" w moim podstawowym magazynie danych w tym momencie.
  • "nie można znaleźć obiektu odpowiadającego błędowi": jakie jest Znaczenie słowa "znaleziony" w tym zdaniu? gdzie? Zdecydowanie "można go znaleźć" w moim podstawowym magazynie danych w tym momencie.

Więc może brakuje mi czegoś odnośnie tego, co existingObjectWithID:error: robi? Dokumentacja mówi:

If there is a managed object with the given ID already registered in the context, that object is returned directly; otherwise the corresponding object is faulted into the context.
[...]
Unlike objectWithID:, this method never returns a fault.
To nie pomaga w moim problemie. Nie mam nic przeciwko temu, żeby mój obiekt był w pełni uszkodzony i to nie jest wina. W rzeczywistości każda wada w nim występująca uruchomi się w następnej linii kodu, gdy uzyskam dostęp do Właściwości obiektu.
  • jaki byłby realistyczny scenariusz prowadzący do NSManagedObjectReferentialIntegrityError?
Dzięki za oświecenie.
Author: Jean-Denis Muys, 2011-12-26

4 answers

Problem w tym, że NSManagedObjectID zaliczenie jest tymczasowe. Możesz to sprawdzić, wywołując metodę NSManagedObjectID ' S isTemporaryID. From docs:

Zwraca wartość logiczną, która wskazuje, czy odbiornik jest tymczasowy.

Większość identyfikatorów obiektów zwraca nr. Nowe obiekty wstawiane do managed object context otrzymują tymczasowy identyfikator, który jest zastępowany ze stałym, gdy obiekt zostanie zapisany do trwałego magazynu.

Należy najpierw zapisać zmiany na trwałe przechowuj , dopiero wtedy uzyskasz stały identyfikator, który zostanie przekazany do innego kontekstu.

 37
Author: Aleksey Kozhevnikov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-20 14:21:59

Jeśli używasz wielu kontekstów, musisz upewnić się, że zapisujesz kontekst a przed przekazaniem zarządzanego identyfikatora obiektu z kontekstu A do innego kontekstu B. dopiero po zakończeniu zapisywania obiekt będzie dostępny z kontekstu B.

-objectWithID: zawsze zwróci obiekt inny niż nil, ale rzuci wyjątek, gdy zaczniesz go używać, jeśli w sklepie nie ma obiektu wspierającego. -existingObjectWithID:error: faktycznie uruchomi jakiś SQL i zrobi I / o, Jeśli ten obiekt nie jest już zarejestrowany z używanym kontekstem on

 8
Author: Daniel Eggert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-27 16:28:10

NSManagedObjectReferentialIntegrityerror = 133000

Kod błędu NSManagedObjectReferentialIntegrityerror oznaczający spróbuj wystrzelić błąd wskazujący na obiekt, który nie istnieje. Na sklep jest dostępny, ale obiekt odpowiadający awarii nie może bądź znaleziony. Dostępne w systemie Mac OS X v10. 4 i nowszych. Zadeklarowane w CoreDataErrors.h.

Zobacz tę dokumentację .

Ten samouczek może być dla Ciebie pomocny.

Więc prawdopodobnym powodem jest to, że próbujesz pobrać obiekt, który nie istnieje. Dzieje się tak zazwyczaj, gdy próbujesz utworzyć obiekt dla nieistniejącego obiektu. Obiekt zostanie zwrócony do ciebie, a gdy spróbujesz uzyskać obiekt z tym obiektem, zostaniesz wyrzucony ten wyjątek.

 2
Author: Madhup Singh Yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-26 11:12:51

Znalazłem je, gdy miałem do czynienia z powiadomieniem NSManagedObjectContextDidSave. Wiele obiektów, które usunął inny kontekst, nie może zostać pobranych, ponieważ (Duh!) zostały usunięte! Jednak niektóre z usuniętych obiektów pokazały się w porządku, jak te, które już popełniłem w bieżącym kontekście.

Możesz mieć podobny problem - obiekty, które możesz znaleźć podczas iteracji sklepu, mogły zostać uszkodzone w tym kontekście, zanim zostały usunięte, a ty albo nie łączą się zmiany z powrotem do tego kontekstu, lub po prostu nie zostały jeszcze połączone.

 0
Author: Stripes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-17 23:03:19