Jak uzyskać obiekt Core Data z określonego ID obiektu?

Mogę łatwo uzyskać ID obiektu w Core Data używając następującego kodu:

NSManagedObjectID *moID = [managedObject objectID];

Jednakże, czy istnieje sposób, aby uzyskać obiekt z magazynu danych rdzenia poprzez nadanie mu określonego ID obiektu? Wiem, że mogę to zrobić używając nsfetchrequest, jak to:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(objectID = %@)", myObjectID];
[fetchRequest setPredicate:predicate];

Chciałbym jednak zrobić to w sposób, który nie inicjuje własnego żądania pobierania. Jakieś pomysły?

Author: Demitri, 2011-02-18

2 answers

Chcesz:

-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID
                                   error:(NSError **)error

Pobiera obiekt ze sklepu, który ma ten identyfikator lub nil, jeśli nie istnieje.

(pamiętaj: istnieją dwie metody na NSManagedObjectContext o podobnych pozornie nazwach, które mnie potknęły. Aby pomóc utrzymać je prosto, oto co robią pozostałe dwie:

-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID

...utworzy obiekt błędu o podanym objectID, Czy taki obiekt rzeczywiście istnieje w sklepie. Jeśli nie istnieje, wszystko, co odpali błąd zawiedzie chyba że najpierw wstawisz obiekt za pomocą insertObject: nsmanagedobjectcontext. Jedyne, co znalazłem, to kopiowanie obiektów ze sklepu do sklepu przy zachowaniu obiektów.

-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID

...zwróci obiekt o tym ID, Jeśli został pobrany ze sklepu przez ten managedObjectContext. Jeśli ktoś wie, do czego ta metoda jest przydatna, proszę o komentarz.)

[eta.: Kolejna istotna różnica między pierwszą metodą a dwiema pozostałymi jest taka, że existingObjectWithID:error: nigdy nie zwraca wina; zawsze pobiera cały przedmiot dla Ciebie. Jeśli próbujesz tego uniknąć (np. pracując z drogim do pobrania obiektem z dużą właściwością blob), musisz być sprytny z objectWithID: lub objectRegisteredForID:, które nie wywołują błędów; lub użyć poprawnie skonfigurowanego żądania pobierania.]

 198
Author: rgeorge,
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-09-21 14:11:21

objectWithID: jest to metoda, której szukasz i jest to zalecany sposób, aby to zrobić. objectWithID: efektywnie użyje NSManagedObjectContext, aby wyciągnąć obiekt tylko tyle poziomów, ile potrzeba - w przeciwieństwie do niektórych innych sposobów na to. objectWithID: poprawnie użyje informacji w pamięci w kontekstach nadrzędnych, koordynatora magazynu trwałego i samego magazynu trwałego przed przejściem do magazynu zapasowego.

Jest to szczegółowo omówione w sesji WWDC 2012 " Core Data Best Praktyki".

 2
Author: quellish,
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-08-07 01:20:29