web-dev-qa-db-fra.com

Comment obtenir un objet Core Data à partir d'un ID d'objet spécifique?

Je peux facilement obtenir l'identifiant d'un objet dans Core Data en utilisant le code suivant:

NSManagedObjectID *moID = [managedObject objectID];

Cependant, existe-t-il un moyen d'extraire un objet du magasin de données principal en lui attribuant un ID d'objet 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?

117
Jason

Tu veux:

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

Récupère l'objet du magasin qui a cet ID, ou nil s'il n'existe pas.

(Attention: il y a deux méthodes sur NSManagedObjectContext avec des noms similaires qui m'ont déclenché. Pour les aider à rester droites, voici ce que font les deux autres:

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

... créera un objet d'erreur avec l'ID d'objet fourni, que ce soit ou non un tel objet existe réellement dans le magasin. S'il n'existe pas, tout ce qui déclenche l'erreur échouera sauf si vous insérez d'abord l'objet avec NSManagedObjectContext insertObject:. La seule utilisation que j'ai trouvée pour cela consiste à copier des objets d'un magasin à l'autre tout en préservant les ObjectID.

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

... retournera l'objet qui a cet ID, if il a été extrait du magasin par cet objet managedObjectContext. Si quelqu'un sait à quoi sert cette méthode, veuillez commenter.)

[eta .: Une autre différence importante entre la première méthode et les deux autres est que existingObjectWithID:error: ne retourne jamais de faute; il va toujours chercher l'objet entier pour vous. Si vous essayez d'éviter cela (par exemple, travailler avec un objet cher à récupérer avec une propriété big blob), vous devez être intelligent avec objectWithID: ou objectRegisteredForID:, qui ne déclenche pas de fautes; ou utilisez une demande d'extraction correctement configurée.]

203
rgeorge

objectWithID: est la méthode que vous recherchez, et c'est la méthode recommandée. objectWithID: utilisera efficacement NSManagedObjectContext pour extraire l’objet autant de niveaux que nécessaire - contrairement à certains autres moyens de le faire. objectWithID: utilisera correctement les informations en mémoire dans les contextes parents, le coordinateur de magasin persistant et le magasin persistant lui-même avant de passer au stockage de sauvegarde.

Ceci est couvert en profondeur dans la WWDC 2012 session "Meilleures pratiques pour les données de base".

4
quellish

Swift 5 version:

https://developer.Apple.com/documentation/coredata/nsmanagedobjectcontext/1506686-existingobject

il existe également des méthodes object(with:) ou registeredObject(for:). En fonction de ce dont vous avez besoin.

0
Antonín Karásek