base de données - l'id de clé primaire d'une ligne dans la base de données

supposons que j'ai une liste de livres stockés dans les données de base. Je recherche 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 être exposé pour moi de toute façon.

est-ce que quelqu'un a des recommandations?

Merci!

39
demandé sur WoodenKitty 2011-01-18 06:19:44

2 réponses

-[NSManagedObject objectID] est l'ID unique d'une instance objet dans les données de base. Il peut être sérialisé via -[NSManagedObjectID URIRepresentation] . Vous pouvez récupérer le objectID d'un coordinateur de magasin persistant avec -[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:] et ensuite obtenir l'objet d'un contexte d'objet géré avec -[NSManagedObjectContext objectWithID:] .

mais

vous devez garder à l'esprit que les données de base est et non un ORM. C'est un graphique d'objet cadre de gestion . C'est-à-dire qu'il utilise SQLite (et les identificateurs de ligne uniques) comme backend est purement un détail d'implémentation. Plus tôt vous pourrez vous libérer de L'état d'esprit SQL/RDBMS, plus vite vous serez satisfait des données de base. Au lieu d'essayer de trouver un objet à partir d'un ID stocké, Considérez 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 à partir de la Foo à Bar et définir l'instance appropriée Bar comme cible de l'association sur l'instance appropriée Foo . Laisser les données de base garder la trace des ID d'objet.

95
répondu Barry Wark 2017-05-23 12:26:04

comme L'a dit Barry Wark, rappelez-vous toujours que les données de base ne sont pas un orm. Les détails SQL purs ne sont pas exposés à l'utilisateur et chaque ligne est juste un objet. Par ailleurs, il est parfois nécessaire d'accéder à la "clé primaire", par exemple lorsque vous devez synchroniser la base de données coredata db 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 L'avoir inséré avec succès dans la base de données distante). Dans ce cas, vous pouvez utiliser:

objectId=[[[myCoredataObject objectID] URIRepresentation] absoluteString]

qui retournera une chaîne comme: x-coredata://76BA122F-0BF5-4D9D-AE3F-BD321271B004 / Object / p521 qui est l'id unique utilisé par coredata pour identifier cet objet.

si vous voulez récupérer un objet avec cet identifiant unique:

NSManagedObject *managedObject= [managedObjectContext objectWithID:[persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:objectId]]];

NB: rappelez-vous que si le récepteur n'a pas encore été sauvegardé dans le contexte de CoreData, l'ID de l'objet est une valeur temporaire qui changera lorsque l'objet sera sauvegardé.

42
répondu Donnit 2011-07-04 08:18:05