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?
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.]
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".
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