Je peux facilement get l'ID d'un object dans Core Data en utilisant le code suivant:
NSManagedObjectID *moID = [managedObject objectID];
Toutefois, existe-t-il un moyen d'extraire un object du magasin de données principal en lui atsortingbuant un ID d'object spécifique? Je sais que je peux le faire en utilisant un NSFetchRequest, comme ceci:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext]; [fetchRequest setEntity:entity]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(objectID = %@)", myObjectID]; [fetchRequest setPredicate:predicate];
Cependant, j'aimerais le faire d'une manière qui n'initie pas sa propre requête d'extraction. Des idées?
Tu veux:
-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID error:(NSError **)error
Extrait l'object du magasin qui a cet ID, ou nul s'il n'existe pas.
(Attention: il y a deux methods sur NSManagedObjectContext avec des noms similaires qui m'ont fait trébucher. Pour les garder droites, voici ce que font les deux autres:
-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID
… crée un object d'erreur avec l'object objectID fourni, qu'un tel object existe ou non dans le magasin. S'il n'existe pas, tout ce qui triggers l'erreur échouera à less que vous insériez l'object en premier avec insertObject: de insertObject:
La seule utilisation que j'ai trouvée pour cela est de copyr des objects d'un magasin à l'autre tout en préservant les ObjectID.
-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID
… returnnera l'object qui a cet ID, s'il a été récupéré du magasin par ce managedObjectContext. Si quelqu'un sait à quoi cette méthode est utile, veuillez commenter.)
[eta .: Une autre différence importante entre la première méthode et les deux autres est que existingObjectWithID:error:
ne returnne jamais un défaut; il récupère toujours l'object entier pour vous. Si vous essayez d'éviter cela (par exemple, travailler avec un object cher à récupérer avec une grande propriété blob), vous devez être intelligent avec objectWithID:
ou objectRegisteredForID:
qui ne triggers pas d'erreurs; ou utilisez une requête d'extraction correctement configurée.]
objectWithID:
est la méthode que vous searchz, et c'est la manière recommandée de le faire. objectWithID:
utilisera efficacement NSManagedObjectContext pour tirer l'object uniquement sur autant de niveaux que nécessaire, contrairement à certains autres moyens. objectWithID:
utilisera correctement les informations en memory dans les contexts parents, le coordinateur de stockage persistant et le magasin persistant lui-même avant d'accéder au stockage de sauvegarde.
Ceci est couvert en profondeur dans la session WWDC 2012 "Core Data Best Practices".