Supposons que j'ai une liste de livres stockés dans Core Data. Je souhaite rechercher un livre par son ID de clé primaire. Je sais que le fichier sqlite créé par Core Data a une colonne ID dans chaque table, mais cela ne semble pas m'être exposé de toute façon.
Quelqu'un a-t-il des recommandations?
Merci!
-[NSManagedObject objectID]
est l'ID unique d'une instance d'objet dans Core Data. Il peut être sérialisé via -[NSManagedObjectID URIRepresentation]
. Vous pouvez récupérer le objectID
d'un coordinateur de magasin persistant avec -[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:]
, puis récupérez l'objet à partir d'un contexte d'objet géré avec -[NSManagedObjectContext objectWithID:]
.
[~ # ~] mais [~ # ~]
Vous devez garder à l'esprit que Core Data est pas un ORM. C'est un framework de gestion de graphes d'objets . Autrement dit, utilise SQLite (et des ID de ligne uniques) comme backend est purement un détail d'implémentation. Plus tôt vous pourrez vous sortir de l'état d'esprit SQL/RDBMS, plus vite vous serez satisfait des Core Data. Au lieu d'essayer de trouver un objet à partir d'un ID stocké, demandez-vous pourquoi vous avez besoin de cet objet et quel objet en a besoin. Si une instance de classe Foo
doit pouvoir accéder à une instance de classe Bar
, pourquoi ne pas simplement créer une association de Foo
à Bar
et définissez l'instance Bar
appropriée comme cible de l'association sur l'instance Foo
appropriée. Laissez Core Data effectuer le suivi des ID d'objet.
Comme l'a dit Barry Wark, rappelez-vous toujours que Core Data n'est pas un orm. Les détails SQL purs ne sont pas exposés à l'utilisateur et chaque ligne n'est qu'un objet. Soit dit en passant, vous devez parfois avoir besoin d'accéder à la "clé primaire", par exemple lorsque vous devez synchroniser la base de données coredata avec des bases de données SQL externes (dans mon cas, j'en avais besoin dans une fonction de rappel pour changer l'état d'un objet après INSERT avec succès dans la base de données distante). Dans ce cas, vous pouvez utiliser:
objectId=[[[myCoredataObject objectID] URIRepresentation] absoluteString]
qui renverra une chaîne comme: x-coredata: // 76BA122F-0BF5-4D9D-AE3F-BD321271B004/Object/p521 qui est l'identifiant unique utilisé par les coredata pour identifier cet objet.
Si vous souhaitez récupérer un objet avec cet identifiant unique:
NSManagedObject *managedObject= [managedObjectContext objectWithID:[persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:objectId]]];
NB: N'oubliez pas que si le récepteur n'a pas encore été enregistré dans le contexte CoreData, l'ID d'objet est une valeur temporaire qui changera lorsque l'objet sera enregistré.